我有一个包含 10 多个解析器的项目,最后有以下代码:
`
cursor = conn.cursor()
my_file = open(r'csv\file.csv')
sql_statement = """
CREATE TEMP TABLE temp
(
LIKE vhcl
)
ON COMMIT DROP;
COPY temp FROM STDIN WITH
CSV
HEADER
DELIMITER AS ',';
INSERT INTO vhcl
SELECT *
FROM temp
ON CONFLICT (id) DO UPDATE SET name= EXCLUDED.name"""
cursor.copy_expert(sql=sql_statement, file=my_file)
conn.commit()
cursor.close()
` 一切都工作正常,直到几周前我开始出现这些错误:
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
我注意到,如果解析器的工作时间(例如)少于 10 分钟,我就不会收到这些错误
我尝试创建一个单独的函数,在解析器结束工作后将数据添加到数据库。 它仍然给我这个错误。奇怪的是,我在我的家用电脑上运行我的解析器,它工作得很好,而且,如果我使用相同的函数手动添加数据,但在不同的文件中,它也工作得很好。
我询问了db的禁止IP,但没关系。所以我不知道为什么会出现这个错误。
您有网络问题。
服务器和客户端都抱怨对方意外挂断了他们的电话。因此,是中间一些配置错误的网络组件导致了线路中断。您有两个选择:
修复网络
降低 PostgreSQL 客户端或服务器上的
tcp_keepalives_idle
,以便操作系统频繁发送“keepalive 数据包”,网络不认为连接空闲
您可能想阅读this了解更多详细信息。
终于,我找到了解决办法。我还是不知道问题出在哪里。这不是连接问题,导致某些具有相同 IP 和相同网络连接的解析器正常工作。我仍然能够使用相同的脚本添加数据,但在单独的项目文件中。
我的解决方案是在连接中添加“keepalives”设置:
conn = psycopg2.connect(
host=hostname,
dbname=database,
user=username,
password=password,
port=port_id,
keepalives=1,
keepalives_idle=30,
keepalives_interval=10,
keepalives_count=5)
这个问题是由另一位开发人员引起的,他同时对数据库进行了更改