由于一些非标准表创建选项,我被迫使用sql转储而不是标准schema.rb(即我在environment.rb config.active_record.schema_format = :sql
中取消注释了这一行)。我注意到当我使用sql转储时,我的灯具似乎没有加载到数据库中。有些数据加载到其中,但我不知道它来自何处。这是正常的吗?如果这是正常的,任何人都可以告诉我这些其他数据来自何处?
答案 0 :(得分:0)
如果从正在转储的脚本加载数据库,那应该就是那里的全部内容。如果您看到其他任何内容,我会尝试删除数据库并从脚本中重新创建它以确保。
另外,如果您只想加载灯具,可以运行:
rake db:fixtures:load
更新
您可能希望找到一种方法,将您的选项包含在迁移中。在我的经验中,以铁轨方式做事几乎总能得到回报。如果有帮助,我会在create table上使用:options选项添加使用mysql集群的自定义选项:
class CreateYourTable < ActiveRecord::Migration
def self.up
create_table :your_table, :options => "ENGINE=NDBCLUSTER" do |t|
#...
end
end
答案 1 :(得分:0)
这是一个非常老的问题,但是即使在将近10年之后,答案仍然是相同的-似乎灯具忽略了模式格式,并且被硬编码以查找YAML文件。从Rails 5.2稳定版开始,这是Rake任务:
第214行使用Dir["#{fixtures_dir}/**/*.yml"]
查找文件,因此仅读取.yml
。
解决方案围绕将SQL固定装置加载到原本为空的数据库中,然后使用yaml_db gem或诸如this blog post中所述的方式将它们作为YAML转储。由于指向博客文章的链接通常很快消失,因此我在下面复制了源代码:
namespace :db do
desc 'Convert development DB to Rails test fixtures'
task to_fixtures: :environment do
TABLES_TO_SKIP = %w[ar_internal_metadata delayed_jobs schema_info schema_migrations].freeze
begin
ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.tables.each do |table_name|
next if TABLES_TO_SKIP.include?(table_name)
conter = '000'
file_path = "#{Rails.root}/test/fixtures/#{table_name}.yml"
File.open(file_path, 'w') do |file|
rows = ActiveRecord::Base.connection.select_all("SELECT * FROM #{table_name}")
data = rows.each_with_object({}) do |record, hash|
suffix = record['id'].blank? ? conter.succ! : record['id']
hash["#{table_name.singularize}_#{suffix}"] = record
end
puts "Writing table '#{table_name}' to '#{file_path}'"
file.write(data.to_yaml)
end
end
ensure
ActiveRecord::Base.connection.close if ActiveRecord::Base.connection
end
end
end
上面的代码由Yi Zeng于2017年7月16日发布。您已将其放在名为lib/tasks/to_fixtures.rake
之类的文件中。我将SQL固定装置数据加载到否则为空/干净的测试模式数据库中,然后运行RAILS_ENV=test bundle exec rake db:to_fixtures
。在Rails 5.2.3下,它按原样对我有效。