rake db:schema:dump 和 rake db:schema:load 相当于 Sequel

rake db:schema:dump and rake db:schema:load equivalent in Sequel

我尝试按照源代码和文档进行操作,但是在迷失了一个上午之后我放弃了:同时 SchemaDumper 中似乎没有做出足够的假设,同时还有没有 SchemaLoader 并遵循 sequel 命令源代码,它似乎破坏了最新的迁移信息(因为它在结果文件中没有 "migrations to date" 类型的信息)。

这样做的动机是测试中的失败迁移(Sequel 认为表不存在,但它们在迁移到新版本时会中断,并且检查挂起的迁移检查失败)-和以前的经验,运行 从历史开始到今天的所有迁移通常是建立数据库的糟糕方法。

到目前为止我已经知道了:

namespace :schema do

  task :dump => :migrations_environment do
    schema = without_sequel_logging{ DB.dump_schema_migration }
    File.open("db/schema.rb", 'w') {|f| f.write(schema) }
  end

  task :load => :migrations_environment do
    Sequel::Migrator.run(DB, "db/schema.rb")
  end

end

通常 load 会失败,因为 Migrator 会做大量的假设,从它开始会得到一个包含特定顺序的文件的文件夹,但这显然正是 sequel -msequel -d 应该根据当前的源代码来做 - sequel -msequel -d 组合显然是当你想做模式转储和模式加载时你应该使用的。

有什么想法吗?

我认为您误解了 Sequel 的模式转储和加载的要点。仅当您有现有数据库并希望从中生成迁移时,才应使用模式转储,以查看 tables/columns 存在的内容,或加载到空数据库中。加载模式转储程序转储的迁移只能在空数据库上完成。

如果您已经有一个非空的现有测试数据库(即以前的迁移已应用到它),您不应该使用模式转储和加载,您应该 运行 迁移器测试数据库。通常,最好在迁移开发数据库之前迁移测试数据库,这样您就可以 运行 测试并查看迁移是否会破坏任何内容。

唯一一次您必须 运行 从一开始就进行所有迁移的情况是您的数据库是空的。如果您迁移测试数据库的方式类似于迁移开发和生产数据库的方式,那么您通常一次只应用一个迁移。

请注意,模式转储程序只能处理可能的一小部分,并且只能在最简单的情况下正常工作。它不处理转储视图、函数、触发器、partial/functional 索引和一系列其他内容。对于除了最简单的情况之外的所有情况,请使用数据库的工具来转储和加载架构。