【问题标题】:Why am I getting ExclusiveLock errors during a rails migration on postgres为什么我在 postgres 上的 rails 迁移期间收到 ExclusiveLock 错误
【发布时间】:2017-10-02 00:37:13
【问题描述】:

尝试运行迁移时出错

WARNING: you don't own a lock of type ExclusiveLock rake aborted! StandardError: An error has occurred, this and all later migrations canceled:

迁移看起来像

def up
    ActiveRecord::Base.establish_connection
    ActiveRecord::Base.connection.execute(
      File.read(File.expand_path('setup.sql'))
    )

    change_column :staff_members, :id, :integer, auto_increment: true
end 

sql文件分支到不同的数据库,这个特定的表需要重新定义它的id列就可以了。

【问题讨论】:

标签: ruby-on-rails postgresql migration


【解决方案1】:

我发现的解决方案是手动关闭连接ActiveRecord::Base.connection.close

【讨论】:

    【解决方案2】:

    我有同样的问题,但在不同的情况下。

    我编写了一个通用的 rake 任务,它允许我运行任何 SQL 脚本文件,并发现当 rake 任务直接运行时它可以正常工作,但如果作为迁移的一部分运行则会失败,从而导致 ExclusiveLock 警告和OP 报告的错误。

    我尝试在 rake 任务中明确关闭连接,但这并没有解决我的问题。

    最终,通过一些额外的日志记录,我发现连接已经建立,我不需要在该上下文中明确建立它(我最初是从this SO question 得到这样做的想法)。我的环境:Ruby 2.3.4 上的 Rails 5.1.4

    删除 ActiveRecord::Base.establish_connection 调用为我解决了这个问题,我的 rake 任务现在可以在迁移内部或外部正常运行。

    我后来在查看一些日志时注意到 PG::ConnectionBad: connection is closed: ROLLBACKPG::ConnectionBad: connection is closed: COMMIT 错误,但这些可能是由显式关闭连接引起的(看起来迁移尝试提交但由于连接关闭而失败,然后尝试ROLLBACK 但由于同样的原因而失败)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      相关资源
      最近更新 更多