ActiveRecord中的表名损坏错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveRecord中的表名损坏错误相关的知识,希望对你有一定的参考价值。

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

E.g:

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中运行时,我们会看到这个错误。队列工作人员似乎做得很好。

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

puma.rb

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

database.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数据库连接并重新初始化连接池。

另一答案

看起来reaping_frequency可能是个问题。我发现有一些人声称他们可能有线程错误。我会尝试删除该选项或将其设置为nil,看看是否有效。我唯一能想到的是你手动调用Thread.new并在其中使用活动记录。以下是几个反对收割的说法:

http://omegadelta.net/2014/03/15/the-rails-grim-reaper/

https://github.com/mperham/sidekiq/issues/1936

在这里搜索“DO fear the Reaper”:https://www.google.com/amp/s/bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid-leaked-connections/amp/

以上是关于ActiveRecord中的表名损坏错误的主要内容,如果未能解决你的问题,请参考以下文章

在具有“已更改”列的表上使用 activerecord 会引发错误

EF6 自定义迁移表名

Hibernate中的ManyToMany映射引用错误(由api生成的表名)表Spring Boot

Rails 中的表关联 - ActiveRecord

我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?

对数据库项目使用完全限定的表名,未解决的引用错误