2008-10-07 11 views
8

Tworzymy aplikację webową Ruby On Rails, w której każdy klient otrzymuje własną bazę danych.
Baza danych musi zostać utworzona po wypełnieniu formularza na naszej stronie internetowej.Jak mogę skopiować bazę danych mySQL w ruby ​​na szynach?

Mamy bazę szablonów, która ma wszystkie tabele i kolumny, które musimy skopiować. Jak mogę to zrobić programowo z rubinu na szynach?

Odpowiedz

7

Z dowolnego kontrolera można zdefiniować następującą metodę.

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 

Zauważ, że nie wiem na pewno, czy zachowa to integralność klucza. Myślę, że zależy to w dużej mierze od tego, jak tworzona jest baza danych szablonu.

0

Można umieścić kod tworzenia schematu szablonu w skrypcie, który zawiera wszystkie wymagane instrukcje tworzenia tabeli/indeksu/widoku/procedury, nazwać je "template_schema.sql" lub cokolwiek innego, a następnie uruchomić skrypt w bazie danych Twój wybór (z Ruby, jeśli to jest to, czego szukasz) i gotowe.

Najlepszym rozwiązaniem jest prawdopodobnie posiadanie każdego obiektu bazy danych w osobnym pliku pod kontrolą źródła (aby ułatwić śledzenie zmian w poszczególnych obiektach), a następnie ich scalenie w jeden plik jako część wdrożenia.

10

Nie jestem pewien co masz na myśli, ale można użyć funkcji wiersza poleceń Rubiego zrzucić bazę szablonów, utworzyć nową bazę danych i ponownie zaimportować go za pomocą programu mysqldump:

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

Here jest dobry opis wywoływania opcji wiersza poleceń z Ruby.

+0

Oto kilka przydatnych informacji. Dzięki. – Tilendor

+0

Czy moja odpowiedź działa dla ciebie? a przynajmniej pomóc? – abarax

+0

Jestem naprawdę nieufny wobec konieczności pójścia do powłoki dla rzeczy, które mogą być wykonane wewnątrz kodu. Nie chcę wprowadzać niepotrzebnej zależności. Ale podany przez ciebie link był bardzo przydatny w przypadku czegoś zupełnie niezwiązanego. – Tilendor

1

Korzystając yaml_db

Musisz zainstalować wtyczki, zrzucić dowolną bazę danych szyny (w tym MySQL) do data.yml pliku przy użyciu zadania natarcia, zmienić ciąg połączenia, aby wskazywał nowej bazy danych, a następnie załadować data.yml na finaly każdej nowej bazy danych (w tym mysql) za pomocą innego zadania rake. Bardzo proste.