【问题标题】:Is there a way to pass option file for rake db:schema:load有没有办法为 rake db:schema:load 传递选项文件
【发布时间】:2017-08-23 11:33:47
【问题描述】:

迁移到 Rails 5 后,我发现 schema.rb 有额外的变化,例如 options 参数添加了有关用于生成架构的数据库的信息。

create_table "student", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci" do |t|
  t.integer "admission_id"
end

我们在 Jenkins 上使用 SQLite3 运行我们的 RSpec 单元测试,该测试运行顺利。但升级后,架构更改现在是特定于数据库的,这无法通过我们在 Jenkins 上的测试。

我想生成两个不同的架构文件(test_schema.rb、schema.rb),一个用于测试,另一个用于生产环境。有没有办法在运行 rake db:schema:load 时传递模式文件。

例子:

rake db:schema:load --schema-file test_schema.rb

如果有人能分享如何使用两个不同的数据库,我也将不胜感激。我知道使用不同的数据库运行测试和生产不是一个好习惯。

【问题讨论】:

  • 顺便说一句,rake 命令现在统一在rails 下。例如rails generate migration ...rails db:migraterails server

标签: ruby-on-rails ruby-on-rails-5


【解决方案1】:

Github rails/rails - Rails 5 schema.rb adding non-agnostic options. dev mysql -> test sqlite 可能会引起您的兴趣(在撰写本文时已公开且似乎没有解决方案)。

我认为 Rails 确实希望 schema.rb 是不可知论的,几乎没有能力拥有单独的模式,但存在一些问题,我猜很少有人真正在一个项目中使用多个数据库供应商。

我真正有的最佳建议是 git 忽略 schema.rb 本身,然后在运行相关的 rails db:* 命令之前和之后复制/重命名 DB 特定的。

【讨论】:

  • Git 忽略对我来说是有意义的 :)
  • 也可以在 rails/rails 中回复。我也刚刚意识到,由于您特别提到了 SQLite3,因此外键问题也可能会烧伤您。你真的想要数据库级别的外键,除非你想要所有额外的努力来担心每个关系可能是 nil,以及由于 ActiveRecord 的竞争条件而导致的孤儿记录等。但是如果你不小心,SQLite 中的 schema.rb 会丢弃它们,即使现代 SQLite 支持外键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2022-09-27
相关资源
最近更新 更多