Ruby on rails 在rails中将db转储到yml设备的标准方法是什么?
我见过一些插件和自定义rake任务将活动db转储到fixture,但我不确定流行的技术是什么 基本上,我想要的是rake:db:fixtures:load的反面,这样我就可以在部署时将基本的db信息(比如管理员用户帐户)放入svn中。我不想为样本数据等需要很长时间的事情手动创建装置 当我们部署时,我希望能够运行Ruby on rails 在rails中将db转储到yml设备的标准方法是什么?,ruby-on-rails,rake,Ruby On Rails,Rake,我见过一些插件和自定义rake任务将活动db转储到fixture,但我不确定流行的技术是什么 基本上,我想要的是rake:db:fixtures:load的反面,这样我就可以在部署时将基本的db信息(比如管理员用户帐户)放入svn中。我不想为样本数据等需要很长时间的事情手动创建装置 当我们部署时,我希望能够运行 rake db:migrate rake db:fixtures:load 然后去参加比赛 在rails中执行此操作的最佳/首选方法是什么 编辑: 因此,似乎没有标准的方法来执行db:
rake db:migrate
rake db:fixtures:load
然后去参加比赛
在rails中执行此操作的最佳/首选方法是什么
编辑:
因此,似乎没有标准的方法来执行db:fixtures:load的相反rake任务
我不想使用迁移,因为我想为我所有的项目使用一种标准的迁移方法,而且我不喜欢在迁移中使用比管理员帐户更多的方法。其次,我一直在重新考虑使用固定装置的想法。我决定使用yaml_db,因为它使用rake任务:
rake db:data:dump
rake db:data:load
数据将在YAML文件中结束,而不会中断测试装置(这可能会有所不同,现在我更仔细地考虑这一点)。另外,如果像Heroku这样的主要发行工具正在使用它,我就不必担心支持/寿命问题
我想这是最接近我将找到的“标准”
感谢所有的精彩回复。它使用的格式与db:fixtures:load所期望的格式并不完全相同,但它使转储和加载数据作为YAML文件变得非常简单。Heroku使用了YamlDB Gem
我认为如果这是标准的管理信息,那么最好在迁移中使用它。理想情况下,夹具应仅用于测试 没有标准的方法来做这件事。仅以标准方式加载设备:
rake db:fixtures:load
但互联网上有很多例子:
- :)
namespace :db do
namespace :fixtures do
desc 'Create YAML test fixtures from data in an existing database.
Defaults to development database. Specify RAILS_ENV=production on command line to override.'
task :dump => :environment do
sql = "SELECT * FROM %s"
skip_tables = ["schema_migrations"]
ActiveRecord::Base.establish_connection(Rails.env)
(ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
i = "000"
File.open("#{Rails.root}/test/fixtures/#{table_name}.yml.new", 'w') do |file|
data = ActiveRecord::Base.connection.select_all(sql % table_name)
file.write data.inject({}) { |hash, record|
hash["#{table_name}_#{i.succ!}"] = record
hash
}.to_yaml
end
end
end
end
end
我找到了这个,并对Rails3做了一些修改。对于其他刚刚找到这个的人,我稍微修改了@jpgeek的答案。将
schema\u migration
表包括在忽略列表中,并按ID排序,这样我得到的输出是table\u name\u 001
forID=1
namespace :db do
namespace :fixtures do
desc 'Create YAML test fixtures from data in an existing database.
Defaults to development database. Specify RAILS_ENV=production on command line to override.'
task :dump => :environment do
sql = "SELECT * FROM %s ORDER BY ID"
skip_tables = ["schema_info", "schema_migrations"]
ActiveRecord::Base.establish_connection(Rails.env)
(ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
i = "000"
File.open("#{Rails.root}/test/fixtures/#{table_name}.yml.new", 'w') do |file|
data = ActiveRecord::Base.connection.select_all(sql % table_name)
file.write data.inject({}) { |hash, record|
hash["#{table_name}_#{i.succ!}"] = record
hash
}.to_yaml
end
end
end
end
end
如果有比管理员帐户更多的数据,我不喜欢使用迁移的想法。我希望我的所有rails项目都有一个标准的过程。不过,你只使用夹具进行测试是对的。我越是考虑这个问题,就越意识到数据应该与fixture或migrations放在一个单独的文件中。如果你使用Heroku,那么你可以使用taps:YamlDB非常适合转储数据库并重新加载它们。但是,YAML格式与fixture不兼容。抱歉,这完全是胡说八道。。为什么YAML foramt不应该与固定装置兼容?对不起,让我说得更准确些。YamlDB创建的YAML格式与用于固定装置的YAML格式不同。YamlDB以:开始,然后包含列:然后记录:它包含列中列出的每个字段的行:对于每个记录。fixture的格式只是记录键(例如users1),后跟字段的键/值对,例如id:1、用户名:bob等。没有列名称或其他元数据。@jpgeek是正确的。不知道为什么这个问题会被否决;YamlDB是相关的,在这种情况下do是无用的。详细说明Rake任务代码的答案是正确的。ar_fixture不适用于Rails 3,并且似乎不再受支持。此外,在Rails的新版本中,您必须将Rails_ENV更改为Rails.ENV.Why.yml.new(与.yml相反),非常感谢。一个多小时以来,我一直在寻找一个直接的解决方案。对于试图为Cumber测试加载fixture的任何人,请将上述内容与以下内容结合起来:,但一定要更改其中一个,以便它们引用相同的fixture文件夹…应该跳过表
schema\u migrations
notschema\u info
@Hari:Rails 3在编写和回答此问题时甚至不存在;大概这两个版本都不是特定的。