2008-10-07 17 views
8

हम रूबी ऑन रेल वेबपैप बना रहे हैं जहां प्रत्येक ग्राहक को अपना डेटाबेस मिल जाता है।
डेटाबेस को हमारी वेबसाइट पर एक फॉर्म भरने के बाद बनाया जाना चाहिए।मैं रेल पर रूबी में एक MySQL डेटाबेस कैसे कॉपी कर सकता हूं?

हमारे पास एक टेम्पलेट डेटाबेस है जिसमें सभी टेबल और कॉलम हैं जिन्हें हमें कॉपी करने की आवश्यकता है। रेलवे पर रूबी से प्रोग्रामेटिक रूप से मैं यह कैसे कर सकता हूं?

उत्तर

7

किसी भी नियंत्रक से, आप निम्न विधि को परिभाषित कर सकते हैं।

def copy_template_database 
     template_name = "customerdb1" # Database to copy from 
     new_name = "temp" #database to create & copy to 

     #connect to template database to copy. Note that this will override any previous 
     #connections for all Models that inherit from ActiveRecord::Base 
     ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => template_name, :host => "olddev", 
     :username => "root", :password => "password" }) 

     sql_connection = ActiveRecord::Base.connection 
     sql_connection.execute("CREATE DATABASE #{new_name} CHARACTER SET latin1 COLLATE latin1_general_ci") 
     tables = sql_connection.select_all("Show Tables") 
     #the results are an array of hashes, ie: 
     # [{"table_from_customerdb1" => "customers"},{"table_from_customerdb1" => "employees},...] 
     table_names = Array.new 
     tables.each { |hash| hash.each_value { |name| table_names << name }} 

     table_names.each { |name| 
      sql_connection.execute("CREATE TABLE #{new_name}.#{name} LIKE #{template_name}.#{name}") 
      sql_connection.execute("INSERT INTO #{new_name}.#{name} SELECT * FROM #{template_name}.#{name}") 
     } 
     #This statement is optional. It connects ActiveRecord to the new database 
     ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev", 
     :username => "root", :password => "password" }) 
    end 

ध्यान दें कि मुझे यह सुनिश्चित करने के लिए पता नहीं है कि यह फोर्जिग कुंजी अखंडता बनाए रखेगा। मुझे लगता है कि यह टेम्पलेट डेटाबेस कैसे बनाया गया है इस पर निर्भर करता है।

0

आप अपने टेम्पलेट स्कीमा निर्माण कोड को एक स्क्रिप्ट में डाल सकते हैं जिसमें सभी आवश्यक तालिका/अनुक्रमणिका/दृश्य/प्रक्रिया निर्माण कथन शामिल हैं, इसे "template_schema.sql" या जो भी हो और फिर डेटाबेस पर स्क्रिप्ट चलाएं आपकी पसंद (रुबी से, यदि आप यही कर रहे हैं) और आप कर चुके हैं।

सबसे अच्छा तरीका शायद प्रत्येक डेटाबेस ऑब्जेक्ट को स्रोत नियंत्रण के तहत एक अलग फ़ाइल में रखना है (व्यक्तिगत वस्तुओं पर परिवर्तनों को ट्रैक करना आसान बनाने के लिए) और फिर उन्हें तैनाती के हिस्से के रूप में एक फ़ाइल में विलय कर दिया गया है।

10

मुझे यकीन है कि तुम क्या मतलब है नहीं कर रहा हूँ, लेकिन आप, माणिक के कमांड लाइन कार्यक्षमता का उपयोग टेम्पलेट डेटाबेस डंप करने के लिए कर सकते हैं mysqldump प्रोग्राम का उपयोग एक नया डेटाबेस और यह फिर से आयात बनाएँ:

> mysqldump -uroot -proot templateDB > dump.sql 
> mysql -uroot -proot --execute="CREATE DATABASE newDB" 
> mysql -uroot -proot newDB < dump.sql 

Here एक है रुबी से कमांड लाइन विकल्पों का आह्वान करने का अच्छा विवरण।

+0

कुछ उपयोगी जानकारी है। धन्यवाद। – Tilendor

+0

क्या मेरा उत्तर आपके लिए काम करता है? या कम से कम मदद? – abarax

+0

मैं वास्तव में कोड के अंदर किए जा सकने वाले कार्यों के लिए खोल पर जाने की आवश्यकता से सावधान हूं। मैं एक अनियंत्रित निर्भरता पेश नहीं करना चाहता हूं। लेकिन आपके द्वारा प्रदान किया गया लिंक पूरी तरह से असंबंधित कुछ के लिए बहुत उपयोगी था। – Tilendor

1

का उपयोग कर yaml_db

आप प्लगइन स्थापित करने के लिए, नए डेटाबेस को इंगित करने के रेक कार्य, परिवर्तन कनेक्शन स्ट्रिंग का उपयोग कर data.yml फ़ाइल में (mysql सहित) किसी भी रेल डेटाबेस डंप की जरूरत है और फिर अंत में data.yml लोड करके एक और रेक डेटाबेस का उपयोग कर कोई नया डेटाबेस (mysql सहित)। बहुत सरल

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

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