Как проверить тип базы данных в Rails Migration?
-
06-07-2019 - |
Вопрос
У меня есть следующая миграция, и я хочу иметь возможность проверить, является ли текущая база данных, связанная со средой, базой данных mysql. Если это mysql, то я хочу выполнить SQL, специфичный для базы данных.
Как мне это сделать?
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
Решение
ActiveRecord :: Base.connection
предоставит вам все, что вы когда-либо хотели знать о соединении с базой данных, установленном boot.rb
и environment.rb код>
ActiveRecord :: Base.connection
возвращает много информации. Таким образом, вы должны точно знать, что вы ищете.
Как отмечает Марсель:
ActiveRecord::Base.connection.instance_of?
ActiveRecord::ConnectionAdapters::MysqlAdapter
, вероятно, лучший способ определить, является ли ваша база данных MySQL.
Несмотря на использование внутренней информации, которая может меняться между выпуском ActiveRecord
, я предпочитаю делать это следующим образом:
ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
Другие советы
Еще более короткий звонок
ActiveRecord::Base.connection.adapter_name == 'MySQL'
Существует имя_адаптера
в AbstractAdapter
, который существует со времен Rails2.
Так что проще использовать в миграции следующим образом:
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
В Rails 3 (возможно, раньше, но в настоящее время я использую Rails 3) использование ActiveRecord :: ConnectionAdapters :: MysqlAdapter - плохой способ сделать это, поскольку он инициализируется, только если используется адаптер базы данных MySQL. Даже если у вас установлен гем MySQL, но это не ваш тип соединения, этот вызов завершится неудачей:
Loading development environment (Rails 3.0.3)
>> ActiveRecord::Base.connection.instance_of? ActiveRecord::ConnectionAdapters::MysqlAdapter
NameError: uninitialized constant ActiveRecord::ConnectionAdapters::MysqlAdapter
from (irb):1
Итак, я бы порекомендовал ответ stasl и использовал свойство connection_name соединения.
Это может помочь:
execute 'изменить пользователей таблицы изменить fb_user_id bigint WHERE USER () = " mysqluser " ;;'