连接网络错误写入 google 云 postgresql 数据库
Connection network error writing to google cloud postgresql database
我是网络开发的新手。我的任务是从网络 api 下载大量数据,并将它们上传到 google 云上的 postgres 数据库。
因为数据量很大,我有一个for-loop,逐个抓取数据,将每个部分插入云端table,最后提交所有内容。我使用 sqlalchemy 和 pg8000 来完成这项工作。
这是我的代码的基本结构:
engine = create_engine("postgresql+pg8000://connection/info")
session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine))
Base = declarative_base()
class MyTableClass(Base):
some columns
Base.metadata.create_all(engine)
for part in scraping_data():
engine.execute(MyTableClass.__table__.insert(), part)
session.commit()
session.close()
engine.dispose()
for循环运行成功12小时。然后我收到一个网络错误。这是第一部分。错误消息的其余部分很长,只是第一部分导致的一串错误。
ERROR:sqlalchemy.pool.impl.QueuePool:Exception closing connection <pg8000.legacy.Connection object at 0x7fa2ba514160>
Traceback (most recent call last):
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/core.py", line 760, in handle_messages
code, data_len = ci_unpack(self._read(5))
struct.error: unpack_from requires a buffer of at least 5 bytes for unpacking 5 bytes at offset 0 (actual buffer size is 0)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1782, in _execute_context
self.dialect.do_executemany(
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 716, in do_executemany
cursor.executemany(statement, parameters)
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/legacy.py", line 304, in executemany
self.execute(operation, parameters)
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/legacy.py", line 252, in execute
self._context = self._c.execute_unnamed(
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/core.py", line 649, in execute_unnamed
self.handle_messages(context)
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/core.py", line 762, in handle_messages
raise InterfaceError("network error on read") from e
pg8000.exceptions.InterfaceError: network error on read
谁能帮我解释一下这个错误?
我的连接似乎刚刚超时。谁能帮助我更好地构建代码,以避免在发生超时时丢失大量下载数据?
谢谢!
正如@Eddie 所证实的那样,他的问题已通过将他的导出作业分解为较小的作业而得到解决。我将发布评论(解决 steps/potential 问题)作为遇到相同问题的任何人的答案。
根据此 link,异常 pg8000.errors.InterfaceError(错误) 是针对与数据库接口而非数据库本身相关的错误引发的一般异常。例如,如果接口尝试使用 SSL 连接但服务器拒绝,则会引发 InterfaceError。
检查您是否在项目中启用了服务网络API。
如果您尝试将私有 IP 地址分配给云 SQL
实例,并且您使用的是共享 VPC,您还需要启用
宿主项目的服务网络 API。
CSV 和 SQL 格式的导出方式不同。 SQL 格式包括
整个数据库,可能需要更长的时间才能完成。采用
CSV 格式和 运行 多个较小的导出作业以减少
每个操作的大小和长度以避免导出期间超时。
也许 temp_file_limit 标志对于您的数据库设置得太低
用法。增加 temp_file_limit 大小。请参阅 配置数据库
旗帜.
检查您是否正确地将 sqlalchemy 会话的范围限定为
此处描述:
https://flask.palletsprojects.com/en/1.1.x/patterns/sqlalchemy/
具体来说,当使用 scoped_session 时,您并没有删除
与@app.teardown_context装饰器的会话。
按照此 documentation 查看是否所有清单
您遇到的连接问题。
我是网络开发的新手。我的任务是从网络 api 下载大量数据,并将它们上传到 google 云上的 postgres 数据库。
因为数据量很大,我有一个for-loop,逐个抓取数据,将每个部分插入云端table,最后提交所有内容。我使用 sqlalchemy 和 pg8000 来完成这项工作。
这是我的代码的基本结构:
engine = create_engine("postgresql+pg8000://connection/info")
session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine))
Base = declarative_base()
class MyTableClass(Base):
some columns
Base.metadata.create_all(engine)
for part in scraping_data():
engine.execute(MyTableClass.__table__.insert(), part)
session.commit()
session.close()
engine.dispose()
for循环运行成功12小时。然后我收到一个网络错误。这是第一部分。错误消息的其余部分很长,只是第一部分导致的一串错误。
ERROR:sqlalchemy.pool.impl.QueuePool:Exception closing connection <pg8000.legacy.Connection object at 0x7fa2ba514160>
Traceback (most recent call last):
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/core.py", line 760, in handle_messages
code, data_len = ci_unpack(self._read(5))
struct.error: unpack_from requires a buffer of at least 5 bytes for unpacking 5 bytes at offset 0 (actual buffer size is 0)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1782, in _execute_context
self.dialect.do_executemany(
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 716, in do_executemany
cursor.executemany(statement, parameters)
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/legacy.py", line 304, in executemany
self.execute(operation, parameters)
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/legacy.py", line 252, in execute
self._context = self._c.execute_unnamed(
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/core.py", line 649, in execute_unnamed
self.handle_messages(context)
File "/home/user/anaconda3/envs/myenv/lib/python3.8/site-packages/pg8000/core.py", line 762, in handle_messages
raise InterfaceError("network error on read") from e
pg8000.exceptions.InterfaceError: network error on read
谁能帮我解释一下这个错误?
我的连接似乎刚刚超时。谁能帮助我更好地构建代码,以避免在发生超时时丢失大量下载数据?
谢谢!
正如@Eddie 所证实的那样,他的问题已通过将他的导出作业分解为较小的作业而得到解决。我将发布评论(解决 steps/potential 问题)作为遇到相同问题的任何人的答案。
根据此 link,异常 pg8000.errors.InterfaceError(错误) 是针对与数据库接口而非数据库本身相关的错误引发的一般异常。例如,如果接口尝试使用 SSL 连接但服务器拒绝,则会引发 InterfaceError。
检查您是否在项目中启用了服务网络API。 如果您尝试将私有 IP 地址分配给云 SQL 实例,并且您使用的是共享 VPC,您还需要启用 宿主项目的服务网络 API。
CSV 和 SQL 格式的导出方式不同。 SQL 格式包括 整个数据库,可能需要更长的时间才能完成。采用 CSV 格式和 运行 多个较小的导出作业以减少 每个操作的大小和长度以避免导出期间超时。 也许 temp_file_limit 标志对于您的数据库设置得太低 用法。增加 temp_file_limit 大小。请参阅 配置数据库 旗帜.
检查您是否正确地将 sqlalchemy 会话的范围限定为 此处描述: https://flask.palletsprojects.com/en/1.1.x/patterns/sqlalchemy/
具体来说,当使用 scoped_session 时,您并没有删除 与@app.teardown_context装饰器的会话。
按照此 documentation 查看是否所有清单 您遇到的连接问题。