gpt4 book ai didi

ruby-on-rails - 如何将现有模型(包括插入的行)从可空列迁移到不可空列

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:47 25 4
gpt4 key购买 nike

我创建了一个带有列定义的模型

create_table :admin_authentication_tokens do |t|
t.integer :authentication_ttl
end

现在我想让 authentication_ttl 不可为空。我试过这个迁移

change_column :admin_authentication_tokens, :authentication_ttl, :integer, null: false, default: 0

但是报错了PG::NotNullViolation:错误:列“authentication_ttl”包含空值
我了解错误的含义,但我不想手动迁移模型。所以请给我一种使用迁移文件迁移模型的方法。

最佳答案

您不能将 NOT NULL 约束添加到包含空值的列。

无论如何,您需要在执行此类迁移之前删除这些值。

例如,正如您上面所建议的,也许这些都应该设置为 0:

MyModel.where(authentication_ttl: nil).update_all(authentication_ttl: 0)

...或者这些列(中的一些)可以设置为其他一些值?

或者这些行实际上没有意义,应该删除?

MyModel.where(authentication_ttl: nil).delete_all

(或者您应该destroy_all,以触发 rails 回调?)

简而言之,答案实际上取决于您的具体情况。但无论如何,您需要先摆脱 null

请注意,如果您有生产环境和本地环境,则需要在部署前考虑到这一点。同样,无论哪种方式(例如,可能通过 rake 任务),您都需要在部署此类迁移之前“修复”生产数据。

关于ruby-on-rails - 如何将现有模型(包括插入的行)从可空列迁移到不可空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53018723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com