Comment vérifier le type de base de données dans une migration Rails?
-
06-07-2019 - |
Question
J'ai la migration suivante et je veux pouvoir vérifier si la base de données actuelle liée à l'environnement est une base de données mysql. Si c'est mysql, je souhaite exécuter le code SQL spécifique à la base de données.
Comment puis-je m'y prendre?
class AddUsersFb < ActiveRecord::Migration def self.up add_column :users, :fb_user_id, :integer add_column :users, :email_hash, :string #if mysql #execute("alter table users modify fb_user_id bigint") end def self.down remove_column :users, :fb_user_id remove_column :users, :email_hash end end
La solution
ActiveRecord :: Base.connection
vous fournira tout ce que vous avez toujours voulu savoir sur la connexion à la base de données établie par boot.rb
et environment.rb
ActiveRecord :: Base.connection
renvoie beaucoup d'informations. Vous devez donc savoir exactement ce que vous recherchez.
Comme le souligne Marcel:
ActiveRecord::Base.connection.instance_of?
ActiveRecord::ConnectionAdapters::MysqlAdapter
est probablement la meilleure méthode pour déterminer si votre base de données MySQL.
Malgré les informations internes susceptibles de changer entre les versions de ActiveRecord
, je préfère le faire de cette manière:
ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
Autres conseils
Appel encore plus court
ActiveRecord::Base.connection.adapter_name == 'MySQL'
Il existe un nom_adaptateur
. dans AbstractAdapter
et existe depuis Rails2.
Il est donc plus facile d'utiliser la migration comme ceci:
adapter_type = connection.adapter_name.downcase.to_sym
case adapter_type
when :mysql
# do the MySQL part
when :sqlite
# do the SQLite3 part
when :postgresql
# etc.
else
raise NotImplementedError, "Unknown adapter type '#{adapter_type}'"
end
Dans Rails 3 (peut-être plus tôt, mais j'utilise actuellement Rails 3), utiliser ActiveRecord :: ConnectionAdapters :: MysqlAdapter est une mauvaise façon de s'y prendre, car il n'est initialisé que si l'adaptateur de base de données utilisé est MySQL. Même si vous avez le joyau MySQL installé, si ce n'est pas votre type de connexion, cet appel échouera:
Loading development environment (Rails 3.0.3)
>> ActiveRecord::Base.connection.instance_of? ActiveRecord::ConnectionAdapters::MysqlAdapter
NameError: uninitialized constant ActiveRecord::ConnectionAdapters::MysqlAdapter
from (irb):1
Donc, je recommanderais la réponse de stasl et utiliserait la propriété nom_adaptateur de la connexion.
Cela pourrait aider:
execute 'modifier les utilisateurs de la table modifier fb_user_id bigint WHERE USER () = "mysqluser",'; '' / <;