首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不可逆转的迁移,可以修复吗?- Rails 4

不可逆转的迁移,可以修复吗?- Rails 4
EN

Stack Overflow用户
提问于 2015-08-07 00:39:54
回答 4查看 3K关注 0票数 2

所以我做了一个这样的迁移

代码语言:javascript
运行
复制
class AddDatetimeAttrToUsers < ActiveRecord::Migration
  def change
    change_column :users, :oauth_expires_at, :datetime
  end
end

在我的本地环境中,它运行得很好,但是当我尝试的时候

heroku运行rake db:迁移,我得到一个错误

代码语言:javascript
运行
复制
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更改属性的最佳实践。

代码语言:javascript
运行
复制
class PutDatetimeFieldToUsersExpireAtColumn < ActiveRecord::Migration
  def change
    remove_column :users, :oauth_expires_at
    add_column :users, :oauth_expires_at, :datetime
  end
end

因此,我尝试使用rake :rollback删除最后一次迁移,并添加此迁移,告诉我最后一次迁移是不可逆转的。

我的问题是,是否有办法真正回滚不可逆转的迁移,还是应该使用上面的新迁移进行迁移?

EN

Stack Overflow用户

发布于 2018-06-27 11:28:03

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

代码语言:javascript
运行
复制
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需要一个“使用”语句。

修复这个问题,步骤1是编辑您的迁移文件,以添加上面Yohann建议的上下迁移。是的,即使您已经对此迁移进行了扫描,也应该这样做。

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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

现在,您应该能够对db:migrate,push到heroku,以及heroku运行rake :migrate并继续前进。

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

票数 2
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31867927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档