Как отключить строгий режим MySQL в Rails

При обновлении до Rails 4 кажется, что строгий режим MySQL теперь включен по умолчанию для соединений Rails. Я говорю это, потому что мое приложение Rails получает «Mysql2::Error: Data too long for column» при сохранении строкового значения длиннее 255 символов. Тем не менее, я вставляю тот же запрос в консоль MySQL (где, как сообщается, глобальный строгий режим отключен), и он работает нормально, только с предупреждениями об усечении. В качестве дополнительного доказательства Здесь написано "Rails 4 по умолчанию используют строгий режим".

Мой вопрос: как я могу отключить строгий режим из приложения Rails? Я бы предпочел не обновлять все, чтобы поддерживать его прямо сейчас.


person mahemoff    schedule 29.01.2014    source источник


Ответы (6)


Вы можете установить строгий режим в файле database.yml с помощью strict: false следующим образом:

production:
  host: ...
  username: ...
  strict: false

https://api.rubyonrails.org/v4.2.8/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html

person nimblegorilla    schedule 19.02.2014
comment
Отлично, это работает для меня и задокументировано. Похоже, правильный выбор. - person mahemoff; 25.03.2014
comment
Я согласен, проверено на моем коде и кажется правильным выбором для рельсов 4, а не для рельсов 3.2 - person Polak; 18.07.2019


Вы можете добавить это в свою базу данных.yml

variables:
   sql_mode: 'traditional'

or

variables:
   strict_mode: false

Видеть:

https://github.com/rails/rails/pull/8346

person Arya    schedule 29.01.2014
comment
Это не сработало, к сожалению. Я попробовал innodb_strict_mode (это фактическая переменная), но установка для нее значения OFF или false по-прежнему вызывает эту ошибку при сохранении записи. Странно то, что переменная была распознана, потому что, если я попробую любое случайное имя переменной в том же месте, она выдаст исключение при запуске Rails. - person mahemoff; 29.01.2014
comment
Работал на меня. См. также github.com/rails/rails/issues/25924, чтобы узнать о последних изменениях в рельсы 5. - person Jared Beck; 29.07.2016

Следуя ответу @edubriguenti, я нашел это. Применив сообщение и комментарий, я добавил следующее к environment.rb, и похоже, что проблема решена.

# Set MySQL to clear sql mode for all connections
class ActiveRecord::ConnectionAdapters::Mysql2Adapter 
  alias :connect_no_sql_mode :connect
  def connect
    connect_no_sql_mode
    execute("SET sql_mode = ''")
  end
end

ActiveRecord::Base.connection.reconnect!
person mahemoff    schedule 06.02.2014
comment
К вашему сведению, для будущих людей, увидевших это, иногда это не работало для меня на рельсах 4.0.3 - в производстве sql_mode почему-то иногда все еще устанавливается на строгий. Я также попробую установить его в database.yml, возможно, они исправили эту настройку. - person Kevin; 14.03.2014
comment
Хорошо. У меня работает на бета-версии 4.1. Пожалуйста, обновите результаты database.yml, так как я еще не пробовал, и, очевидно, он чище, если он работает. - person mahemoff; 14.03.2014
comment
У меня возникла проблема с этим, когда он больше не входил в строгий режим, как ожидалось. Поиск ответа @nimblegorilla работает правильно. - person mahemoff; 25.03.2014

Ответ @arya может не сработать, потому что 'traditional' режим sql является строгим, если вы хотите установить его нестрогим, попробуйте следующее:

sql_mode: ''

надеюсь, это поможет

person Piotr Kruczek    schedule 31.01.2014
comment
У меня работало с Rails 4.2. - person Piers C; 20.02.2016

Попробуйте это:

# Set MySQL to clear sql mode for all connections
class ActiveRecord::ConnectionAdapters::MysqlAdapter 
  alias :connect_no_sql_mode :connect
  def connect
    connect_no_sql_mode
    execute("SET sql_mode = ''")
  end
end
person edubriguenti    schedule 06.02.2014
comment
Это было хорошей отправной точкой, но вызывает ошибку в современных Rails. Пересмотрено в моем ответе выше. - person mahemoff; 07.02.2014