2008-10-07 7 views
8

우리는 모든 고객이 자신의 데이터베이스를 얻는 Ruby On Rails 웹 애플리케이션을 만들고 있습니다.
웹 사이트에서 양식을 작성한 후에 데이터베이스를 만들어야합니다.레일즈상의 루비에서 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이입니다 Ruby에서 명령 행 옵션을 호출하는 좋은 설명. yaml_db

당신은, 플러그인을 설치 새 데이터베이스를 가리 키도록 레이크 작업, 변경 연결 문자열을 사용 data.yml 파일로 (MySQL을 포함) 레일 데이터베이스를 덤프해야하고 마침내에 data.yml로드 사용하여

+0

그 밖의 유용한 정보 감사. – Tilendor

+0

내 대답이 도움이 되었습니까? 또는 적어도 도움이 될까요? – abarax

+0

코드 내부에서 할 수있는 일을 위해 쉘에 갈 필요가 있음을 정말로 조심스럽게 생각합니다. 불필요한 의존성을 도입하고 싶지 않습니다. 그러나 당신이 제공 한 링크는 완전히 무관 한 무언가에 매우 유용했습니다. – Tilendor

1

다른 레이크 작업을 사용하는 새로운 데이터베이스 (mysql 포함). 매우 간단합니다.

관련 문제