首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PG::ConnectionBad: PQsocket()无法获得套接字描述符:删除记录时回滚

PG::ConnectionBad: PQsocket()无法获得套接字描述符:删除记录时回滚
EN

Stack Overflow用户
提问于 2020-03-22 15:36:53
回答 1查看 1.2K关注 0票数 0

跑步:

代码语言:javascript
运行
复制
Price.find(208999).delete

在rails控制台中,将导致错误消息:

代码语言:javascript
运行
复制
SQL (0.0ms)  DELETE FROM "prices" WHERE "prices"."id" = $1  [["id", 208999]]
ActiveRecord::StatementInvalid: PG::ConnectionBad: PQsocket() can't get 
socket descriptor: DELETE FROM "prices" WHERE "prices"."id" = $1'

随后对同一命令进行重试会导致:

代码语言:javascript
运行
复制
SQL (4.0ms)  DELETE FROM "prices" WHERE "prices"."id" = $1  [["id", 208999]]
ActiveRecord::StatementInvalid: PG::ConnectionBad: PQconsumeInput() server 
closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
: DELETE FROM "prices" WHERE "prices"."id" = $1

此时,我的I无法在没有遇到此问题的情况下运行任何查询命令。在运行delete之前,可以在另一个表上删除另一个SQL。

我尝试过堆栈溢出中与此错误相关的所有其他链接:

我没有任何规范/rspec rake任务设置,但是我尝试了rails tmp:清除哪个状态,"#清除缓存和套接字文件从.“

我已经检查过是否有任何关联到这个记录到另一个表,但是我的搜索没有返回任何东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-22 15:50:01

经过几个小时的搜索..。

问题是,在我的price.rb模型文件中,我声明了以下关系:

代码语言:javascript
运行
复制
class Price < ApplicationRecord
    belongs_to :card

    has_and_belongs_to_many :collections

    has_many :types

    class << self # Class methods
    end
end

我删除了price.types关联记录,但是我没有这样做,并且删除了card.prices关联记录。

所以我运行的命令是:

代码语言:javascript
运行
复制
price = Price.find(208999)

card = price.card

#delete price_card association record
card.prices.delete(price)

#now i'll be able to delete the price record
price.delete

确实需要有一个更好的错误消息,因为我一直在修改我的database.yml文件并重新设置我的套接字,因为这就是错误消息导致您相信的。

希望这将有助于其他人在处理数据库配置方面的混乱。

编辑2

刚刚再次出现了这个问题,我更新到了PostgreSQL的最新版本,即12.4,当我阅读dba stackexchange answer时,这是在PostgreSQL 11中发出DELETE sql命令时常见的问题,这是我正在运行的。

但这并没有解决问题。

在下载并仔细查看了pgAdmin4生成的日志文件之后,我发现了对关系键的引用,因此我创建了一个小脚本来循环遍历所有记录,并将任何赋值键值设置为nil,因此在删除时不会抛出任何讨厌的错误。

代码语言:javascript
运行
复制
Product.all.each do |product|
  product.update(cardset_id:nil,language_id:nil)
  product.delete
end

编辑3

所以我终于找到了我的PostgreSQL数据库疯狂的真正原因。

我有一个名为“纸牌”的表,它有一个弹格字段,其中有unique: true选项集。

在我的卡片模型中,我有一个函数

代码语言:javascript
运行
复制
extend FriendlyId
friendly_id (:slug_id), use: :slugged

def slug_id
    [
        [:name, :cardset_id],
    ]
end

通过名称和cardset_id的混合创建了一个弹状体,但是如果我想要相同记录的不同副本,它是出于某种原因创建相同的弹状体id。

当PostgreSQL去获取这个记录时,它会中断,因为数据没有意义,而且它一开始就不应该存在。

所以我的鼻涕虫功能不像预期的那样有问题。

在删除每个记录之前,我只需将段塞设置为一个随机值,然后删除它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60801298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档