Comment désactiver le mode strict MySQL dans les Rails

Upgrading to Rails 4, il semble que le mode strict MySQL est maintenant activé par défaut pour les connexions Rails. Je dis cela parce que mon application de Rails obtient "Mysql2::Error: Data too long for column" (erreur Mysql2:: données trop longues pour la colonne) en sauvegardant une valeur de chaîne de caractères de plus de 255 caractères. Pourtant, je colle la même requête dans la console MySQL (où le mode Global strict est désactivé) et ça marche très bien, juste avec des avertissements de troncature. Comme preuve supplémentaire,il est dit ici<!-Les Rails 4 utilisent tous les deux le mode strict par défaut."

ma question Est Comment puis-je désactiver le mode strict de L'application Rails? Je préfère éviter de tout mettre à jour pour le supporter maintenant.

19
demandé sur mahemoff 2014-01-29 05:04:02

6 réponses

Vous pouvez définir le mode strict dans votre base de données.yml à l'aide de strict: false comme suit:

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

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html

19
répondu nimblegorilla 2014-12-12 04:34:00

vous pouvez ajouter ceci à votre base de données.yml

variables:
   sql_mode: 'traditional'

ou

variables:
   strict_mode: false

Voir:

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

4
répondu Arya 2014-01-29 01:34:29

suite à la réponse de @edubriguenti,j'ai trouvé ce. L'application de la poste et le commentaire, j'ai ajouté ce qui suit à environment.rb et il semble avoir résolu le problème.

# 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!
4
répondu mahemoff 2014-02-06 22:12:06

mysql2 gem expose une option pour exécuter un commande initiale de connexion et de reconnexion. Vous pouvez définir l' init_command à partir de database.yml:

production:
  host: ...
  username: ...
  init_command: "SET @@SESSION.sql_mode = ''"
4
répondu Graeme 2017-09-09 07:35:56
'traditional' sql strictes, si vous voulez en faire à la non-stricte, essayez ceci:

sql_mode: ''

Hope qui aide

2
répondu Piotr Kruczek 2014-01-31 11:37:18

essaye ceci:

# 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
1
répondu edubriguenti 2014-02-06 11:31:26