Jor*_*ein 9 sqlite rake gem ruby-on-rails rails-engines
寻求将我的所有共享模型移动到可以包含在我的每个微应用程序中的引擎.
该引擎应为我们的所有遗留数据提供模型层,包括:
模型文件正在自动修补,没关系.
使用Nikolay Strum的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
Run Code Online (Sandbox Code Playgroud)
我们需要rake db:create
和rake db:schema:load
工作,
这些db.rake
补丁仅影响db:schema:dump
和db:test:load_schema
(我假设为tests_prepare的一部分).我试图修补它们db:schema:load
使用:
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
Run Code Online (Sandbox Code Playgroud)
但这给了我错误NoMethodError: undefined method 'recreate_database' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x007feb6bb43558>
.显然,这仅适用于Oracle类型的数据库?
什么是底层DROP
和CREATE DATABASE
sql 的Rails命令我试图影响额外schema.rb
的?
您正在使用 SQLite 作为数据库引擎。希望这就是您想做的事情。
由于您正在创建 SQLite Database ,因此与其他数据库适配器(例如 MySQLAdpter 或 Postgress)略有不同。
对于 MySQL,必须在建立连接之前通过使用“CREATE DATABASE ...”SQL 命令创建数据库。所以在建立连接之前必须先创建数据库。
但对于 SQLite,由于数据库驻留在一个文件中,并且一个文件只能包含一个数据库,因此不需要单独的步骤来创建数据库。尝试建立与数据库本身的连接将导致创建数据库文件。
因此,使用 SQLiteAdapter 时 create_database 方法将不起作用。您只需从代码中删除该行即可。
您可以查看 Rake 任务 db:create 的源代码
另外,SQLiteDatabaseTasks 中“create”方法的源代码。正如你所看到的,它只是调用了create_connection方法
归档时间: |
|
查看次数: |
818 次 |
最近记录: |