ruby-on-rails - ActiveRecord 中的表名损坏错误

标签 ruby-on-rails ruby activerecord puma

在使用 ActiveRecord 时,我们偶尔会遇到 PG::UndefinedTable 错误。关联表名称有些损坏,我经常看到 Cancelled 附加到表名的末尾。

例如:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "fooCancell" does not exist 
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "Cancelled" does not exist
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "barC" does not exist

在上面的示例中,我使用 foobar 混淆了表名。

当 Rails 项目在 Puma 中运行时,我们会看到这个错误。队列工作人员似乎做得很好。

错误消息中的表格与真实的表格或模型不对应。看起来像是内存损坏的情况。有没有人见过这样的问题?如果是这样,您是如何解决的?

美洲狮.rb

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

数据库.yml

production:
  url:  <%= ENV["DATABASE_URL"] %>
  pool: <%= ENV['DB_CONNECTION_POOL_SIZE'] || 5%>
  reaping_frequency: <%= ENV['DB_CONNECTION_REAPING_FREQUENCY'] || 10 %>
  prepared_statements: false

最佳答案

我在这里冒险猜测,基于 this possibly related error ...

但你可能是:

  1. 在您的应用程序中调用fork;或者
  2. 在服务器 (puma) 派生其工作进程之前(在应用程序初始化期间)调用 ActiveRecord 例程(使用数据库调用)。

其中任何一个都会破坏 ActiveRecord 的同步并导致多个进程共享数据库连接池而不同步它的使用(导致交错和损坏的数据库命令)。

如果您正在使用 fork,请确保关闭所有 ActiveRecord 数据库连接并重新初始化连接池(有一个函数调用可以执行此操作,但我不记得它在顶部我的脑袋,也许是 ActiveRecord.disconnect!ActiveRecord.connection_pool.disconnect!)。

否则,在运行 Puma 之前(在初始化过程中或使用 Puma 的 after_fork),关闭所有 ActiveRecord 数据库连接并重新初始化连接池。

关于ruby-on-rails - ActiveRecord 中的表名损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48816533/

相关文章:

javascript - 我们如何在 ruby​​ on Rails 文档中使用 d3.js?

ruby-on-rails - OS X 10.8 上 Rails 应用程序中的段错误

ruby-on-rails - `undefined method ` 查找 Assets ' for nil:NilClass`

ruby-on-rails - 根据索引值映射对象

ruby-on-rails - 验证关联的 bool 值 True

sql - Rails 按 :created_at, 返回 :status column, 的计数对表进行分组,然后使用每个唯一值的计数对 :status 列进行子分组

sql - ActiveRecord查询明细和摘要数据

ruby-on-rails - LinkedIn Oauth 错误 : 'The partner did did not properly implement the authentication protocol' on browser back after signin

ruby-on-rails - Rails 生产服务器 : stylesheets not displaying!

ruby-on-rails - 有没有更高效的方法来创建这个数组?