是使用sql转储创建测试数据库时加载的fixture

时间:2008-12-23 14:42:37

标签: ruby-on-rails fixtures

由于一些非标准表创建选项,我被迫使用sql转储而不是标准schema.rb(即我在environment.rb config.active_record.schema_format = :sql中取消注释了这一行)。我注意到当我使用sql转储时,我的灯具似乎没有加载到数据库中。有些数据加载到其中,但我不知道它来自何处。这是正常的吗?如果这是正常的,任何人都可以告诉我这些其他数据来自何处?

2 个答案:

答案 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任务:

https://github.com/rails/rails/blob/5-2-stable/activerecord/lib/active_record/railties/databases.rake#L198

第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下,它按原样对我有效。