gpt4 book ai didi

mysql - 在 Rails 中使用 gh-ost 进行列删除

转载 作者:可可西里 更新时间:2023-11-01 08:59:15 26 4
gpt4 key购买 nike

我们正在使用 GitHub gh-ost用于我们的 Rails 应用程序中的在线迁移。目标是将迁移与应用程序代码更改分离开来,并避免在不影响站点性能的情况下不能简单地通过 Rake 任务运行的较大迁移需要停机。

很好,但有一个异常(exception):删除列。当我们删除一个列时,Rails 会感到困惑并开始抛出异常。原因是 Rails schema cache .即使应用程序代码没有引用该列(我们强加的流程要求,在运行 gh-ost 迁移之前必须满足)Rails 仍然认为它在那里。因此,在表上使用 SELECT * 的默认行为会导致它尝试从(数据库迁移完成后)不再存在的列中获取数据。

我们正在尝试针对这个问题提出一个解决方案,该解决方案仍然可以让我们实现上述两个目标。两种可能性是 (1) 在 gh-ost 迁移完成后重新启动 Rails 服务器或 (2) 在 gh-ost 迁移完成后清除 Rails 模式缓存。这两种方法都是可行的,尽管它们限制了我们完全将在线迁移与应用程序代码更改分离的能力,并且两者都有可能影响站点性能。

考虑到我们的数据库和应用程序的大小,我认为我们不愿意考虑的另一个选项是关闭 Rails 模式缓存。

有没有其他人解决过这个问题?我们有哪些选择?

最佳答案

我在 GitHub 上问过 issues page for gh-ost ,并学习了一些应对这一挑战的方法:

对于 Rails 4,覆盖 ActiveRecord::Base.columns 以从相关模型的列数组中删除该列:

class User < ActiveRecord::Base
def self.columns
super.reject {|column| column.name == 'employee_email'}
end
end

在 Rails 5 中,这可以使用 .ignored_columns 来完成:

class User < ApplicationRecord
self.ignored_columns = %w(employee_email)
end

归功于 this blog post用于代码示例。

另一种方法是从相关关联中删除“预先加载”,这样 Rails 模式缓存就不会像我的问题中描述的那样受到干扰。

无论选择哪个选项,它都必须在执行 gh-ost 迁移之前部署到 Rails 应用程序。这可确保无论该列是否存在,应用程序都能正常运行,从而无需在 gh-ost 迁移切换后重新启动 Rails 应用程序。

关于mysql - 在 Rails 中使用 gh-ost 进行列删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49991781/

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