当使用Psycopg2时,Postgres在查询期间关闭连接

2024-04-29 07:14:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行postgresql9.6(在Docker中,使用postgres:9.6.13图片)和psycopg2 2.8.2。在

我的PostgreSQL服务器(本地)托管两个数据库。我的目标是在一个数据库中创建物化视图,该视图使用另一个数据库中的数据,使用Postgres的外部数据包装器。我从一个使用psycopg2的Python脚本来完成这些。在

只要创建物化视图的时间不太长(例如,导入的数据量不是太大),这种方法就可以很好地工作。但是,如果该过程花费的时间超过大约250秒,psycopg2将抛出异常

psycopg2.OperationalError: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

在Postgres的日志中找不到错误消息(或任何与此相关的消息)。在

如果我从SQL客户机(Postico)创建物化视图,它将成功完成。在

这段代码大致说明了我在Python脚本中所做的工作:

^{pr2}$

Tags: the数据docker脚本视图数据库消息server
2条回答

postgresql9.6可能会在https://stackoverflow.com/a/45627782/1587329中提到的新超时之后终止连接。那样的话,你可以

the statement_timeout in postgresql.conf

但它是not recommended。在

它可能在Postico中有效,因为该值已在那里设置。在

要记录一个错误,您需要将log_min_error_statement设置为ERROR或更低,以便它显示出来。在

keepalive参数添加到psycopg2.connect调用中似乎解决了问题:

self.db = pg.connect(
            dbname=config.db_name,
            user=config.db_user,
            password=config.db_password,
            host=config.db_host,
            port=config.db_port,
            keepalives=1,
            keepalives_idle=30,
            keepalives_interval=10,
            keepalives_count=5
        )

我还是不知道为什么这是必要的。我找不到其他人描述过在Docker中使用Postgres时必须使用keepalives参数关键字的人,只是为了能够运行耗时超过4-5分钟的查询,但也许很明显没有人注意到这一点?在

相关问题 更多 >