सवाल एकाधिक डेटाबेस के साथ रेल 3.1 कनेक्टिंग


ShowNearby पर हम PHP से RoR 3.1 पर बहुत बड़ा माइग्रेशन कर रहे हैं और हमें कई समस्याओं का सामना करना पड़ रहा है जो आप में से कुछ पहले हल हो सकते हैं।

हमारे पास बड़ी मात्रा में डेटा है और हमने अपने डीबी को कई डीबी में अलग करने का फैसला किया है जिसे हम अलग-अलग संभाल सकते हैं। उदाहरण के लिए, हमारे खाते, स्थान, लॉग और अन्य कई डेटाबेस में विभाजित होते हैं

हमें अच्छी तरह से खेलने के लिए माइग्रेशन, फिक्स्चर, मॉडल, प्राप्त करने की आवश्यकता है, और अब तक यह काफी गन्दा हो गया है। समाधान के लिए स्वीकार्य होने के लिए हमारी कुछ आवश्यकताओं:

  • एक मॉडल डेटाबेस में से एक में एक टेबल से संबंधित होना चाहिए।
  • रेक डीबी: ड्रॉप - डेटाबेस डेटाबेस में निर्दिष्ट सभी डेटाबेस env ड्रॉप करना चाहिए
  • रेक डीबी: बनाएँ - डेटाबेस डेटाबेस में निर्दिष्ट सभी डेटाबेस env बनाना चाहिए
  • रेक डीबी: माइग्रेट - विभिन्न डेटाबेस में माइग्रेशन चलाएं
  • रेक डीबी: परीक्षण - फिक्स्चर लेना चाहिए और उन्हें विभिन्न डेटाबेस और परीक्षण इकाई / समारोह / आदि में छोड़ देना चाहिए

हम प्रत्येक डेटाबेस के लिए अलग रेल परियोजनाओं को स्थापित करने और उन्हें सक्रिय संसाधन के साथ जोड़ने पर विचार कर रहे हैं, लेकिन हमें लगता है कि यह बहुत ही कुशल नहीं है। क्या आप में से कोई भी पहले इसी तरह की समस्या से निपटता है?

बहुत बहुत धन्यवाद!!


76
2018-05-25 09:50


मूल


हम एक PHP अनुप्रयोग से एक रेल के लिए भी उन्नयन पर विचार कर रहे हैं; क्या आपके पास इसके साथ कोई भाग्य है? - Tommyixi
हाय @ टॉमीक्सी: यह बहुत समय पहले था और तब से बहुत कुछ बदल गया है। पूर्व-निरीक्षण में मुझे लगता है कि अब यह एक डेटाबेस में उन्हें कई डेटाबेस में विभाजित करने के बजाय एक बेहतर समाधान है। - Fer Martin


जवाब:


Wukerplank के उत्तर में, आप डेटाबेस नाम में कनेक्शन विवरण भी सामान्य रूप से एक नाम के साथ डाल सकते हैं:

log_database_production:
  adapter: mysql
  host: other_host
  username: logmein
  password: supersecret
  database: logs

फिर अपने विशेष मॉडल में:

class AccessLog < ActiveRecord::Base
  establish_connection "log_database_#{Rails.env}".to_sym
end

उन अजीब प्रमाण-पत्रों को अपने एप्लिकेशन कोड में रखने से रोकने के लिए।

संपादित करें: यदि आप कई मॉडलों में इस कनेक्शन का पुन: उपयोग करना चाहते हैं, तो आपको एक नया सार वर्ग बनाना चाहिए और इससे प्राप्त होना चाहिए, क्योंकि कनेक्शन कड़े रूप से कक्षाओं के साथ मिलते हैं (जैसा समझाया गया है यहाँ, यहाँ, तथा यहाँ), और प्रत्येक वर्ग के लिए नए कनेक्शन बनाए जाएंगे।

यदि ऐसा है, तो चीजों को इस प्रकार सेट करें:

class LogDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "log_database_#{Rails.env}".to_sym
end

class AccessLog < LogDatabase
end

class CheckoutLog < LogDatabase
end

141
2018-05-25 15:11



पर्यावरण परिवर्तन के लिए कैसे खाते हैं? तो उदाहरण के लिए मैं विकास करना चाहता हूं establish_connection उसके साथ log_dev डेटाबेस लेकिन उत्पादन में मैं चाहता हूँ establish_connection उसके साथ log डेटाबेस। क्या मैं सिर्फ कॉल कर सकता हूं Rails.env ? - Robert Audi
@AzizLight establish_connection "log_database_#{Rails.env}" - Unixmonkey
आगाह किया जाना चाहिए। ऐसा प्रतीत होता है कि इस विधि का उपयोग करके अतिरिक्त डेटाबेस पर कनेक्शन को दोबारा उपयोग किए बिना खुलता है। यह आपके आवेदन को भारी भार के तहत रोक देगा। - Altonymous
@Altonymous अच्छा बिंदु। मुझे लगता है कि आप इस व्यवहार का जिक्र कर रहे हैं: github.com/rails/rails/issues/7019 कनेक्शन कक्षा के साथ मिल जाता है; इसलिए यदि आपको कनेक्शन का पुन: उपयोग करने की आवश्यकता है, तो आपको इसे एक सार वर्ग पर स्थापित करना चाहिए और एआर :: बेस के बजाय इसे प्राप्त करना चाहिए। मैंने इसे प्रतिबिंबित करने के लिए अपना उत्तर अपडेट किया। - Unixmonkey
वहां कुछ नया नहीं है, इसे जांचने की ज़रूरत नहीं है - mrbrdo


विभिन्न डेटाबेस से कनेक्ट करना काफी आसान है:

# model in the "default" database from database.yml
class Person < ActiveRecord::Base

  # ... your stuff here

end

# model in a different database
class Place < ActiveRecord::Base

  establish_connection (
    :adapter  => "mysql",
    :host     => "other_host",
    :username => "username",
    :password => "password",
    :database => "other_db"
  )

end

मैं कई रेल परियोजनाओं को स्थापित करने से सावधान रहूंगा क्योंकि आप अपने नियंत्रकों के लिए डेटा पुनर्प्राप्ति के लिए बहुत अधिक ओवरहेड जोड़ देंगे, जो चीजों को धीमा कर सकता है।

माइग्रेशन, फिक्स्चर, मॉडल इत्यादि के बारे में आपके प्रश्नों के लिए: मुझे नहीं लगता कि एक आसान तरीका होगा, इसलिए कृपया अलग प्रश्न पोस्ट करें और जितना हो सके उतना विशिष्ट हो।

डीबी को एक में मजबूत करना एक विकल्प नहीं है? यह आपके जीवन को बहुत आसान बना देगा!


18
2018-05-25 10:06



परेशानी यह है कि उपरोक्त नमूने के साथ कनेक्शन पूलिंग का सही ढंग से उपयोग नहीं किया जाएगा - Sam Saffron


एक महान पोस्ट मिला जो दूसरों को इस चेक आउट करने के सही तरीके से इंगित करेगा http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html

इसे इस तरह से सेट करें:

डेटाबेस.एमएलएल (डीबी कॉन्फ़िगरेशन फ़ाइल)

support_development:
    adapter: blah
    database: blah
    username: blah
    password: blah

support_base.rb (एक मॉडल फ़ाइल)

class SupportBase < ActiveRecord::Base
    self.abstract_class = true #important!
    establish_connection("support_development")
end

tst_test.rb (एक मॉडल फ़ाइल)

class TstTest < SupportBase 
    #SupportBase not ActiveRecord is important!

    self.table_name = 'tst_test'

    def self.get_test_name(id)
        if id = nil
            return ''
        else
            query = "select tst_name from tst_test where tst_id = \'#{id}\'"
            tst = connection.select_all(query) #select_all is important!
            return tst[0].fetch('tst_name')
        end
    end
end

पीएस, यह वास्तव में माइग्रेशन को कवर नहीं करता है, मुझे नहीं लगता कि आप रेक के साथ एक से अधिक डीबी पर माइग्रेशन कर सकते हैं (हालांकि मुझे यकीन नहीं है कि एक कठिन 'नहीं कर सकता', यह संभव हो सकता है)। यह उन अन्य डीबी को जोड़ने और पूछने का एक शानदार तरीका था जिन्हें आप नियंत्रित नहीं करते हैं।


11
2017-07-13 23:59





आप रेल पर्यावरण को भी जोड़ना चाहते हैं, इसलिए आपका विकास और परीक्षण डेटाबेस समान नहीं हैं।

establish_connection "legacy_#{Rails.env}"

4
2018-05-16 13:18





निम्नलिखित लेख कई डेटाबेस के खिलाफ माइग्रेशन प्राप्त करने के लिए नए रेक कार्यों को परिभाषित करने का सुझाव देता है। प्रत्येक कार्य अपना कनेक्शन सेट करता है और फिर इस कनेक्शन और विशिष्ट डेटाबेस फ़ोल्डर के साथ माइग्रेशन निष्पादित करता है।

यह एक परिचित भी परिभाषित करता है db:migrate जो दो अन्य कार्यों को बुलाता है।

यहां लिंक शामिल है अनुपलब्ध हो जाता है:

desc "Migrate the database through scripts in db/migrate directory."

namespace :db do
  task :migrate do
    Rake::Task["db:migrate_db1"].invoke
    Rake::Task["db:migrate_db2"].invoke
  end

  task :migrate_db1 do
    ActiveRecord::Base.establish_connection DB1_CONF
    ActiveRecord::Migrator.migrate("db/migrate/db1/")
  end

  task :migrate_db2 do
    ActiveRecord::Base.establish_connection DB2_CONF
    ActiveRecord::Migrator.migrate("db/migrate/db2/")
  end
end

स्रोत:  रेल पर रूबी एकाधिक डेटाबेस और माइग्रेशन से कनेक्ट करें


3
2018-06-17 14:30





अरे यह पोस्ट पुराना है लेकिन मुझे रेल 3.2 पर काम करने का एक समाधान मिला है जो किसी और की मदद कर सकता है। https://stackoverflow.com/a/16542724/1447654


1
2018-05-14 13:35