Rails 마이그레이션에서 데이터베이스 유형을 어떻게 확인합니까?
-
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
많은 정보를 반환합니다. 그래서 당신은 당신이 찾고있는 것을 정확히 알아야합니다.
Marcel이 지적한 것처럼 :
ActiveRecord::Base.connection.instance_of?
ActiveRecord::ConnectionAdapters::MysqlAdapter
데이터베이스 MySQL인지 결정하는 가장 좋은 방법 일 것입니다.
사이에 변경 될 수있는 내부 정보에 의존 함에도 불구하고 ActiveRecord
릴리스, 나는이 방법을 선호합니다.
ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
다른 팁
더 짧은 전화
ActiveRecord::Base.connection.adapter_name == 'MySQL'
있습니다 adapter_name
안에 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 Gem이 설치되어 있더라도 연결 유형이 아닌 경우 WIL 실패를 호출하십시오.
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의 답변을 권장하고 연결의 adapter_name 속성을 사용합니다.
도움이 될 수 있습니다 :
execute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'