rake db:schema:dump 没有为所有数据库生成模式
rake db:schema:dump is not producing schema for all databases
我有这个项目,我需要将一堆数据库集成到我的 Rails 项目中。
这是我必须使用的数据库配置。
$ 纳米 config/database.yml
production:
adapter: mysql2
reconnect: true
pool: 5
username: user_xyz
password: 123456
database: database1
host: localhost
database_2:
adapter: mysql2
reconnect: false
pool: 5
username: user_xyz
password: 123456
database: database2
host: 192.168.2.100
database_3:
adapter: mysql2
reconnect: false
pool: 5
username: user_xyz
password: 123456
database: database3
host: 192.168.2.101
database_4:
adapter: mysql2
reconnect: false
database: database4
pool: 5
username: user_xyz
password: 123456
host: 192.168.2.102
我需要更新 db/schema.rb
中的模式,但不幸的是它只生成用于生产(数据库 1)的模式。
$ RAILS_ENV=production bundle exec rake db:schema:dump
我不能只是运行这个,因为它抱怨:
$ bundle exec rake db:schema:dump
rake aborted!
database configuration does not specify adapter
我需要做什么才能将所有这些数据库导入 db/schema.rb
?
您将需要与要进行架构转储的每个数据库建立连接。这是 database_4
的示例
ActiveRecord::Base.establish_connection 'database_4'
然后当您 运行 模式转储时,它会转储您当前连接的数据库。我不确定 rake 任务是否有将其复制到不同文件名的参数,因此您可能必须重命名该文件。
Austio 的回答很好。以下是有关如何实施解决方案的一些额外细节。创建一个新的 rake 文件,例如 lib/tasks/schema_dump.rake
,并添加以下内容:
namespace :db do
namespace :schema do
desc 'dumps the schema of database_1 to db/schema_db1.rb'
task :dump_db1 => :environment do
ActiveRecord::Base.establish_connection 'database_4'
File.open(Rails.root.join('db', 'schema_db1.rb'), 'w') do |file|
ActiveRecord::SchemaDumper.dump ActiveRecord::Base.connection, file
end
end
end
end
现在,当您 运行 rake db:schema:dump
时,它会将主数据库的模式转储到 db/schema.rb
(就像传统的 Rails)。但是当你 运行 rake db:schema:dump_db1
时,它会将你的 database_1
块的架构转储到 db/schema_db1.rb
.
您可以为其他数据库块创建类似的任务,并为每个数据库创建一个架构文件。
我有这个项目,我需要将一堆数据库集成到我的 Rails 项目中。
这是我必须使用的数据库配置。
$ 纳米 config/database.yml
production:
adapter: mysql2
reconnect: true
pool: 5
username: user_xyz
password: 123456
database: database1
host: localhost
database_2:
adapter: mysql2
reconnect: false
pool: 5
username: user_xyz
password: 123456
database: database2
host: 192.168.2.100
database_3:
adapter: mysql2
reconnect: false
pool: 5
username: user_xyz
password: 123456
database: database3
host: 192.168.2.101
database_4:
adapter: mysql2
reconnect: false
database: database4
pool: 5
username: user_xyz
password: 123456
host: 192.168.2.102
我需要更新 db/schema.rb
中的模式,但不幸的是它只生成用于生产(数据库 1)的模式。
$ RAILS_ENV=production bundle exec rake db:schema:dump
我不能只是运行这个,因为它抱怨:
$ bundle exec rake db:schema:dump
rake aborted!
database configuration does not specify adapter
我需要做什么才能将所有这些数据库导入 db/schema.rb
?
您将需要与要进行架构转储的每个数据库建立连接。这是 database_4
的示例ActiveRecord::Base.establish_connection 'database_4'
然后当您 运行 模式转储时,它会转储您当前连接的数据库。我不确定 rake 任务是否有将其复制到不同文件名的参数,因此您可能必须重命名该文件。
Austio 的回答很好。以下是有关如何实施解决方案的一些额外细节。创建一个新的 rake 文件,例如 lib/tasks/schema_dump.rake
,并添加以下内容:
namespace :db do
namespace :schema do
desc 'dumps the schema of database_1 to db/schema_db1.rb'
task :dump_db1 => :environment do
ActiveRecord::Base.establish_connection 'database_4'
File.open(Rails.root.join('db', 'schema_db1.rb'), 'w') do |file|
ActiveRecord::SchemaDumper.dump ActiveRecord::Base.connection, file
end
end
end
end
现在,当您 运行 rake db:schema:dump
时,它会将主数据库的模式转储到 db/schema.rb
(就像传统的 Rails)。但是当你 运行 rake db:schema:dump_db1
时,它会将你的 database_1
块的架构转储到 db/schema_db1.rb
.
您可以为其他数据库块创建类似的任务,并为每个数据库创建一个架构文件。