oma*_*oma 4 postgresql ruby-on-rails rails-activerecord
Rails 5.1 将主键的默认类型从integer 更改为 bigint。我们错过了这一点,现在我们得到了整数和 bigint 的混合结果。
我们应该在整数溢出再次袭击我们之前摆脱困境(其他项目,其他故事)。
我很乐意看到一个聪明的迁移脚本改变一切
列出整数类型主键的方法将是一个好的开始。
警告:在大型表上更改主键类型的速度很慢。如果可以的话,做好计划。
这个问题并不是特别受欢迎......评论“只是做工作”并投票结束。无论如何,我会分享我学到的东西,希望对某人有帮助。
好的,让我们“只做工作”:
schema.rb 中提示了什么是整数主键以及什么是 bigint
#schema.rb
create_table "users", id: :serial, force: :cascade do |t|
Run Code Online (Sandbox Code Playgroud)
整数主键的提示是id: :serial,参考这个答案:/sf/answers/3827839991/
你的主键有多大?
#Rails console
ActiveRecord::Base.connection.execute('SELECT MAX(id) FROM comments').first
{"max"=>91718106}
Run Code Online (Sandbox Code Playgroud)
允许的最大值为 20 亿,准确地说是 2 147 483 647。
rails g migration change_primary_key_to_bigint
Run Code Online (Sandbox Code Playgroud)
class ChangePrimaryKeyToBigint < ActiveRecord::Migration[6.0]
def up
change_column :users, :id, :bigint
Run Code Online (Sandbox Code Playgroud)
change_column :users, :id, :bigint
change_column :user_companies, :user_id, :bigint
change_column :posts, :author_id, :bigint
Run Code Online (Sandbox Code Playgroud)
彻底!
搜索您的 schema.rb 中的所有内容_id并仔细评估每个内容。
您可能有多个引用、连接表、自定义引用命名,甚至是您可能会忽略的多态关联。
等待。持续时间取决于桌子的大小。
如果零停机时间对您很重要,那么这篇文章看起来很有前途:https://buildkite.com/blog/avoiding-integer-overflows-with-zero-downtime
| 归档时间: |
|
| 查看次数: |
1754 次 |
| 最近记录: |