ruby - rake 数据库 :schema:dump and rake db:schema:load equivalent in Sequel

标签 ruby sequel

我尝试按照源代码和文档进行操作,但在迷失了一个上午之后我放弃了:同时,似乎在 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 会进行大量假设,从它会按特定顺序获得一个装满文件的文件夹开始,但这是显然 sequel -msequel -d 根据当前源代码应该做什么 - 以及 sequel -msequel -d 组合显然是您在进行模式转储和模式加载时应该使用的组合。

有什么想法吗?

最佳答案

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

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

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

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

关于ruby - rake 数据库 :schema:dump and rake db:schema:load equivalent in Sequel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48299054/

相关文章:

ruby-on-rails - OpenSSL::SSL::SSLError in UsersController#create (SSL_connect returned=1 errno=0 state=unknown state: unknown protocol)

mysql - 有没有办法通过 Sequel 中的连接来理清 SQL 日志

ruby - 在 sequel/ruby 中难以捕获 postgresql 异常

java - 使用 Java 和 Ruby 实现 JSON 中的多态性或继承

ruby - 如何使用 Ruby 连接到多个 WebSockets?

mysql - Sequel::AdapterNotFound: LoadError: 无法加载此类文件 -- mysql

ruby - 我不明白 many_to_one <=> one_to_one 模型关联

ruby - 如何使用 Sequel 递归保存模型?

ruby-on-rails - 参数转换的禅宗方式[:date] to Date?

ruby-on-rails - Rails 应用程序的领域驱动设计 : Implementing a service in a basic example