连接网络错误写入 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。

  1. 检查您是否在项目中启用了服务网络API。 如果您尝试将私有 IP 地址分配给云 SQL 实例,并且您使用的是共享 VPC,您还需要启用 宿主项目的服务网络 API。

  2. CSV 和 SQL 格式的导出方式不同。 SQL 格式包括 整个数据库,可能需要更长的时间才能完成。采用 CSV 格式和 运行 多个较小的导出作业以减少 每个操作的大小和长度以避免导出期间超时。 也许 temp_file_limit 标志对于您的数据库设置得太低 用法。增加 temp_file_limit 大小。请参阅 配置数据库 旗帜.

  3. 检查您是否正确地将 sqlalchemy 会话的范围限定为 此处描述: https://flask.palletsprojects.com/en/1.1.x/patterns/sqlalchemy/

    具体来说,当使用 scoped_session 时,您并没有删除 与@app.teardown_context装饰器的会话。

  4. 按照此 documentation 查看是否所有清单 您遇到的连接问题。