【问题标题】:Migration changed various unrelated models columns from Integer to Bigint type迁移将各种不相关的模型列从 Integer 更改为 Bigint 类型
【发布时间】:2021-01-21 21:28:03
【问题描述】:

我创建了各种迁移来为模型 :foo 添加一个布尔列,回填它并向它添加一个空约束。

我运行了迁移并检查了git diff schema.rb 文件,该文件明显发生了变化。

经过进一步检查,我注意到在我运行迁移时,其他 5 个模型中所有称为 cover_file_size 的各个列的类型已从 integer 更改为 bigint

这些模型甚至没有相互关联,我想不出未经我同意发生这种情况的原因。

Rails 中是否存在某种可能引发所有这些更改的默认行为? integer 类型的列变成bigint 有什么问题吗?到目前为止,我在运行该平台时没有遇到任何问题。

【问题讨论】:

  • 运行迁移后,Rails 会将当前数据库模式转储为 schema.rb 文件,如果您有另一个用户更新了 schema.rb 并且您有不同的数据库设置,您最终可能会使用不同的 schema.rb 文件,其中的更改与您刚刚运行的实际迁移无关。我对此并不太担心,除非您特别需要使用架构文件,否则应该没问题。您可以在任何地方使用相同的数据库来最小化这种情况。

标签: ruby-on-rails database migration


【解决方案1】:

更改数据库中的列的问题是停机。当您在生产环境中部署和迁移它时,它会在更改此列时锁定整个表。如果它是一张大桌子,可能会出现明显的停机时间。

更长的解释: 您没有指定您使用的是哪个 SQL(Postgres/MySQL?)。但大多数时候改变列的类型意味着:

  • 创建一个新列
  • 复制旧列中的所有数据
  • 删除旧列

为了确保所有内容都被正确复制,这次将锁定整个表格。锁定意味着无法读取或写入。因此,停机时间。

至于为什么会这样,能否提供 Ruby、Rails 和 SQL 版本?也许您最近更新了其中一个?

另外,您确定在迁移之前您的数据库中有integer 吗?我的意思是在数据库中,而不是在模式中(这些并不总是相同的)。

架构可以来自两个地方:

  • 这是您上次运行迁移时 rails 生成的内容。如果从那时起,您以其他方式对数据库进行了一些更改,它将在架构中不可见。但是下次运行迁移 rails 时会更新架构以匹配当前的数据库状态。
  • 这是你从 git 下载的东西。也许另一个开发人员有一个使用integers 的数据库,他们运行迁移将值更改为integer 并推送它。但是您的本地数据库使用bigint,所以现在您运行迁移它已再次更新。

如果您正在与其他人一起工作,请检查架构文件上的 git blame 以查看这些字段是否始终为 integer

【讨论】:

  • 我们使用的是 Rails 6.0.3.4 和 Postgres。 git blame 文件显示了我在迁移时引入的更改。我完全不知道更改是如何引入的,也不知道它是否对平台本身产生了重大影响。
  • 只是为了确定。当您说“git blame 文件显示更改是我与迁移一起引入的”时,您的意思是您最近引入了从integerbigint 的更改,对吗?但在那之前。架构中是否总是integer?有其他人在您之前更改过它吗?
  • 以及对平台的影响。一般来说,bigint 更好。简单的integer 太小,如果您的表中有很多行,您就有可能用完 id。现在推荐使用bigint。但就像我说的 - 它会在迁移过程中导致一些停机时间。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多