2009-10-27 16 views
41

मेरे पास निम्न माइग्रेशन है और मैं यह जांचने में सक्षम होना चाहता हूं कि पर्यावरण से संबंधित वर्तमान डेटाबेस एक 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 

उत्तर

37

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" 
+1

'ActiveRecord :: Base.connection.instance_of? ActiveRecord :: कनेक्शनएडाप्टर :: MySQL एडाप्टर को हल करना चाहिए। –

-4

यह मदद कर सकता है:

execute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'

+1

यह काम नहीं करेगा जब उपयोगकर्ता अलग है और, किसी भी डेटाबेस जहां 'उपयोगकर्ता()' फ़ंक्शन मौजूद नहीं है काम नहीं करेगा जैसे SQLite। –

55

इससे भी अधिक कम कॉल

ActiveRecord::Base.connection.adapter_name == 'MySQL' 
+6

मैं mysql2 मणि ​​का उपयोग कर रहा हूं, और मुझे संदेह है कि कुछ अन्य इस बिंदु पर हो सकते हैं, इसलिए मैं निम्न का उपयोग करता हूं: 'ActiveRecord :: Base.connection.adapter_name.downcase.starts_with? 'mysql'' – bensnider

+5

'ActiveRecord :: Base.connection.adapter_name ==" MySQL 2 "ने रेल के साथ मेरे लिए काम किया 4. – Jason

8

रेल 3, (शायद पहले में, लेकिन मैं वर्तमान में रेल 3 का उपयोग कर रहा हूं) ActiveRecord :: ConnectionAdapters का उपयोग कर :: MySQL एडाप्टर इसके बारे में जाने का एक खराब तरीका है, क्योंकि यह केवल प्रारंभ होता है यदि उपयोग में डेटाबेस एडाप्टर MySQL है। यहां तक ​​कि अगर आप MySQL मणि स्थापित है, अगर यह आपके कनेक्शन प्रकार नहीं है है, कि कॉल 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 संपत्ति का उपयोग करें।

25

AbstractAdapter में है और यह रेल 2 के बाद से है।

तो यह इस तरह प्रवास में उपयोग करने के लिए आसान है:

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 
+2

यह mysql2 मणि ​​के साथ काम नहीं करेगा-आप केवल' '' होने के लिए लाइन को संपादित कर सकते हैं : mysql,: mysql2'''। – mrm

+0

आपका उत्तर अधिक पूर्ण और साफ है। धन्यवाद। – cassioscabral

+0

पोस्टग्रेज़ के लिए: ' def is_postgres? नाम = ActiveRecord :: Base.connection.adapter_name.downcase नाम = ~/पोस्टग्रेस/ अंत ' – Blaskovicz

संबंधित मुद्दे