gpt4 book ai didi

ruby-on-rails - 不可逆迁移,能修复吗? - rails 4

转载 作者:太空宇宙 更新时间:2023-11-03 16:22:09 25 4
gpt4 key购买 nike

所以我做了这样的迁移

class AddDatetimeAttrToUsers < ActiveRecord::Migration
def change
change_column :users, :oauth_expires_at, :datetime
end
end

在我的本地环境中它工作得很好但是当我尝试时

heroku run rake db:migrate 我得到一个错误

ERROR:  column "oauth_expires_at" cannot be cast automatically to type timestamp without time zone
HINT: Specify a USING expression to perform the conversion.

当我搜索它时,我创建了一个像这样的新迁移作为使用 change 更改属性的最佳实践。

class PutDatetimeFieldToUsersExpireAtColumn < ActiveRecord::Migration
def change
remove_column :users, :oauth_expires_at
add_column :users, :oauth_expires_at, :datetime
end
end

所以我尝试使用 rake db:rollback 删除上次迁移并添加这个通知我上次迁移是不可逆的。

我的问题是,有没有办法实际回滚不可逆的迁移,或者我应该使用上面的新迁移来迁移?

最佳答案

在您的示例中,您有以下迁移文件:

class AddDatetimeAttrToUsers < ActiveRecord::Migration
def change
change_column :users, :oauth_expires_at, :datetime
end
end

您已经在您的开发环境中成功运行了 rake db:migrate。您在本地运行 sqlite3,在 heroku 上运行 PG,因此,您的 change_column 在本地运行,但在 PG 上失败,因为 PG 需要一个“using”语句。

要解决此问题,第 1 步是编辑您的迁移文件以按照上面 Yohann 的建议添加向上和向下迁移。是的,即使您已经进行了这次迁移,您也应该这样做。

class AddDatetimeAttrToUsers < ActiveRecord::Migration
def up
change_column :users, :oauth_expires_at, :datetime
end
def down
change_column :users, :oauth_expires_at, :time (or whatever type existed before datetime)
end
end

现在您可以运行 rake db:rollback 并避免不可逆的迁移错误,但前提是您没有添加额外的迁移。如果您添加了额外的迁移,您将需要使用 rake db:down VERSION=2018xxxxxxxrake db:rollback STEP=X 指定要返回多远。

现在编辑迁移,使其与 pg 和 sqlite3 兼容:

class AddDatetimeAttrToUsers < ActiveRecord::Migration
def up
change_column :users, :oauth_expires_at, :datetime, using: 'oauth_expires_at::datetime'
end
def down
change_column :users, :oauth_expires_at, :time

end

现在您应该能够 rake db:migrate,推送到 heroku,然后 heroku 运行 rake db:migrate 并继续。

最后,您应该让 pg 在本地工作以匹配您的生产环境。

关于ruby-on-rails - 不可逆迁移,能修复吗? - rails 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31867927/

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