我尝试了通过源代码和文档,但是在一个失去的早晨之后我放弃了:同时它似乎在SchemaDumper
并且在同一时间做出了不足的假设时间没有SchemaLoader
,并且通过sequel
命令源代码,它似乎破坏了迁移信息到目前为止(因为它没有"到目前为止的迁移"种类结果文件中的信息)。
执行此操作的动机是测试中的迁移失败(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
做出了一系列假设,从一个特定顺序给出一个满是文件的文件夹,但这显然正是{{1}并且sequel -m
应该根据当前的源代码执行 - sequel -d
和sequel -m
组合显然是你想要进行架构转储时应该使用的内容。架构负载。
有什么想法吗?
答案 0 :(得分:1)
我认为你误解了续集的模式转储和加载。只有在拥有现有数据库且希望从中生成迁移时,才应使用模式转储,以查看存在的表/列,或者加载到空数据库中。加载由架构转储器转储的迁移只能在空数据库上完成。
如果您已经有一个非空的现有测试数据库(即先前已对其应用了迁移),则不应使用模式转储和加载,您应该只在测试数据库上运行迁移器。通常,最好在迁移开发数据库之前迁移测试数据库,这样就可以运行测试并查看迁移是否会破坏任何内容。
您从一开始就必须运行所有迁移的唯一时间是您有一个空数据库。如果迁移测试数据库的方式与迁移开发和生产数据库的方式类似,则通常一次只应用一次迁移。
请注意,架构转储程序只处理可能的一小部分,并且只能在最简单的情况下正常工作。它不处理转储视图,函数,触发器,部分/功能索引以及一系列其他内容。除了最简单的情况之外,使用数据库的工具来转储和加载模式。