2015-12-22 40 views
9

Tìm cách di chuyển tất cả các mô hình được chia sẻ của tôi sang một công cụ có thể được bao gồm trong mỗi ứng dụng vi mô của tôi.Làm thế nào để tải nhiều lược đồ vào một công cụ hoặc ứng dụng Rails?

Động cơ này nên cung cấp một lớp mô hình cho tất cả các dữ liệu di sản của chúng tôi, bao gồm:

  • file mẫu
  • file
  • Schema
  • Migrations (chúng tôi đang theo Pivotal Labs' pattern, đây không phải là vấn đề)

Tệp mô hình đang được tự động vá, điều đó vẫn ổn.

file Schema đang được khỉ vá trong việc sử dụng Nikolay Strum's db.rake:

namespace :db do 
    namespace :schema do 
    # desc 'Dump additional database schema' 
    task :dump => [:environment, :load_config] do 
     filename = "#{Rails.root}/db/foo_schema.rb" 
     File.open(filename, 'w:utf-8') do |file| 
     ActiveRecord::Base.establish_connection("foo_#{Rails.env}") 
     ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file) 
     end 
    end 
    end 

    namespace :test do 
    # desc 'Purge and load foo_test schema' 
    task :load_schema do 
     # like db:test:purge 
     abcs = ActiveRecord::Base.configurations 
     ActiveRecord::Base.connection.recreate_database(abcs['foo_test']['database'], mysql_creation_options(abcs['foo_test'])) 
     # like db:test:load_schema 
     ActiveRecord::Base.establish_connection('foo_test') 
     ActiveRecord::Schema.verbose = false 
     load("#{Rails.root}/db/foo_schema.rb") 
    end 
    end 
end 

Chúng ta cần rake db:createrake db:schema:load để làm việc,

Các db.rake bản vá lỗi chỉ ảnh hưởng đến db:schema:dumpdb:test:load_schema (một phần của tests_prepare, tôi giả sử) . Tôi đã cố gắng vá chúng vào db:schema:load sử dụng:

namespace :db do 

    # Helpers 
    def mysql_creation_options(config) 
    @charset = ENV['CHARSET'] || 'utf8' 
    @collation = ENV['COLLATION'] || 'utf8_unicode_ci' 
    {:charset => (config['charset'] || @charset), :collation => (config['collation'] || @collation)} 
    end 

    def load_schema(schema_name) 
    abcs = ActiveRecord::Base.configurations 
    ActiveRecord::Base.connection.recreate_database(abcs[schema_name+'_test']['database'], mysql_creation_options(abcs[schema_name+'_test'])) 
    # like db:test:load_schema 
    ActiveRecord::Base.establish_connection(schema_name+'_test') 
    ActiveRecord::Schema.verbose = false 
    load("#{Rails.root}/db/#{schema_name}_schema.rb") 
    end 

    namespace :schema do 
    # desc 'Dump additional database schema' 
    task :dump => [:environment, :load_config] do 
     dump_schema = -> (schema_name) { 
     filename = "#{Rails.root}/db/#{schema_name}_schema.rb" 
     File.open(filename, 'w:utf-8') do |file| 
      ActiveRecord::Base.establish_connection("#{schema_name}_#{Rails.env}") 
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file) 
     end 
     } 

     dump_schema.call('kiddom') 
     dump_schema.call('kiddom_warehouse') 
    end 

    # When loading from schema, load these files, too 
    task :load => [:environment, :load_config] do 
     load_schema('kiddom') 
     load_schema('kiddom_warehouse') 
    end 
    end 

    namespace :test do 
    # desc 'Purge and load foo_test schema' 
    task :load_schema do 
     load_schema('kiddom') 
     load_schema('kiddom_warehouse') 
    end 
    end 
end 

Nhưng điều này mang lại cho tôi những lỗi NoMethodError: undefined method 'recreate_database' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x007feb6bb43558>. Rõ ràng, điều này chỉ hoạt động trên cơ sở dữ liệu kiểu Oracle?

Lệnh Rails cho các số DROPCREATE DATABASE sql cơ bản là gì? Tôi đang cố gắng ảnh hưởng đến số lượng thêm schema.rb?

+0

tôi làm việc với một động cơ có chứa mô hình một lần. Chúng tôi chỉ chia sẻ các mô hình và di chuyển và hoạt động tốt. Sơ đồ '.rb' chúng tôi giữ riêng cho từng ứng dụng; động cơ không được cung cấp. Điều này làm cho cảm giác imho kể từ khi cơ sở dữ liệu thuộc về một ứng dụng, không phải cho một động cơ. HTH – Raffael

+0

Thx Raffael! Trong hầu hết các trường hợp, bạn hoàn toàn chính xác: Công cụ thêm mã mô hình mới hoặc mở rộng các mô hình hiện tại và có ý nghĩa để cho schema.rb hoạt động trong ứng dụng. Tuy nhiên, trong trường hợp của chúng ta, động cơ đại diện cho các mô hình sống trong một cơ sở dữ liệu hoàn toàn khác - vì vậy chúng ta cần có một tệp lược đồ khác cho các mô hình này (phải không?) –

+0

Tôi hiểu. Tôi chưa bao giờ làm việc với nhiều cơ sở dữ liệu, mặc dù tôi luôn tò mò như thế nào để làm điều này. Rõ ràng bạn có thể sử dụng các cơ sở dữ liệu khác nhau trên cơ sở từng mô hình. Nó nhận được một chút trickyer nếu bạn cần phải chạy di trú trên cơ sở dữ liệu bổ sung, quá; xem http://excid3.com/blog/rails-activerecord-multiple-databases-and-migrations/ – Raffael

Trả lời

0

Bạn đang sử dụng SQLite làm công cụ cơ sở dữ liệu của mình. Hy vọng đó là những gì bạn muốn làm.

Vì bạn đang tạo Cơ sở dữ liệu SQLite, mọi thứ khác một chút so với các bộ thích ứng cơ sở dữ liệu khác như MySQLAdpter hoặc Postgress.

Trong trường hợp MySQL, cơ sở dữ liệu phải được tạo trước khi thiết lập kết nối bằng cách chi tiêu các lệnh SQL "CREATE DATABASE ...". Vì vậy, bạn phải tạo cơ sở dữ liệu trước khi thiết lập kết nối.

Nhưng trong trường hợp SQLite, vì cơ sở dữ liệu nằm trong một tệp và một tệp chỉ có thể chứa một cơ sở dữ liệu, không có bước riêng biệt để tạo cơ sở dữ liệu. Một nỗ lực để thiết lập một kết nối đến cơ sở dữ liệu chính nó sẽ gây ra các tập tin cơ sở dữ liệu được tạo ra.

Do đó phương thức create_database sẽ không hoạt động khi sử dụng SQLiteAdapter. Bạn có thể chỉ cần xóa dòng đó khỏi mã của mình.

Bạn có thể có một cái nhìn vào mã nguồn cho các Rake nhiệm vụ db: tạo

https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake

Ngoài ra, các mã nguồn cho phương pháp 'tạo' trong SQLiteDatabaseTasks. Như bạn thấy, nó chỉ đơn giản gọi phương thức establish_connection

https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake

Các vấn đề liên quan