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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – ActiveRecord中的表名损坏错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
偶尔我们在使用ActiveRecord时会出现PG :: UndefinedTable错误.关联表名称是一些如何损坏,我经常看到
取消附加到表名的末尾.

例如:

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

在上面的示例中,我使用foo和bar对表名进行了模糊处理.

当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,我在这里猜测…

但你可能是:

>在您的应用程序中调用fork;要么
>在服务器(puma)分支工作进程(在应用程序初始化期间)之前调用ActiveRecord例程(使用数据库调用).

这些中的任何一个都会破坏ActiveRecord的同步并导致多个进程共享数据库连接池而不同步它的使用(导致隔行扫描和损坏的数据库命令).

如果您正在使用fork,请确保关闭所有ActiveRecord数据库连接并重新初始化连接池(有一个函数调用,但我不记得它的顶部,可能是ActiveRecord.disconnect!或ActiveRecord .connection_pool.disconnect!).

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

猜你在找的Ruby相关文章