Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Postgresql的Google应用程序引擎上的SQLAlchemy和pg8000 KeyError/Breaked Pipe_Python_Postgresql_Google App Engine_Flask_Sqlalchemy - Fatal编程技术网

Python 使用Postgresql的Google应用程序引擎上的SQLAlchemy和pg8000 KeyError/Breaked Pipe

Python 使用Postgresql的Google应用程序引擎上的SQLAlchemy和pg8000 KeyError/Breaked Pipe,python,postgresql,google-app-engine,flask,sqlalchemy,Python,Postgresql,Google App Engine,Flask,Sqlalchemy,我的目标是在我的Postgresql dv(在云SQL上)上成功地执行Select语句,在Google app Engine上的我的Flask应用程序中使用SQLAlchemy的ORM 我能够成功部署应用程序,它成功连接到数据库并发出select语句。然而,在应用程序运行大约1小时后,我开始从查询中得到以下错误。请注意,这些查询在1小时之前成功运行,并且我能够从pgAdmin或本地python代码在数据库上成功运行查询 有两个错误,第一个是发生在pg8000/core.py第1778行的KeyE

我的目标是在我的Postgresql dv(在云SQL上)上成功地执行Select语句,在Google app Engine上的我的Flask应用程序中使用SQLAlchemy的ORM

我能够成功部署应用程序,它成功连接到数据库并发出select语句。然而,在应用程序运行大约1小时后,我开始从查询中得到以下错误。请注意,这些查询在1小时之前成功运行,并且我能够从pgAdmin或本地python代码在数据库上成功运行查询

有两个错误,第一个是发生在pg8000/core.py第1778行的KeyError。在git上,这一行是

这就是错误,使用except块进行处理,但在该except块中会引发一个中断的Pip错误

File "/env/lib/python3.7/site-packages/pg8000/core.py", line 1778, in execute ps = cache['ps'][key] KeyError: ('SELECT voice_comments.id AS voice_comments_id, voice_comments.store_id AS voice_comments_store_id, voice_comments.comment_date AS voice_comments_comment_date, voice_comments.survey_item AS voice_comments_survey_item, voice_comments.comment_text AS voice_comments_comment_text, voice_comments.overall_satisfaction AS voice_comments_overall_satisfaction, voice_comments.visit_date AS voice_comments_visit_date \nFROM voice_comments \nWHERE voice_comments.store_id = %s AND voice_comments.comment_date >= %s AND voice_comments.comment_date <= %s AND voice_comments.overall_satisfaction = %s AND voice_comments.id NOT IN (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', ((705, 0, <function Connection.__init__.<locals>.text_out at 0x3eb1a3fb7c20>), (1114, 1, <function timestamp_send_integer at 0x3eb1a4a6d320>), (1114, 1, <function timestamp_send_integer at 0x3eb1a4a6d320>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>), (21, 1, <built-in method pack of Struct object at 0x3eb1a4a41030>)))
我从三个部分来考虑这一点:

一,。 我最近从MySQL切换到PostgresSQL。使用MySQL时,我没有遇到断管错误……或者至少在我不知情的情况下,他们在幕后得到了优雅的处理。我担心我在做一些高水平的蠢事。在使用SQLAlchemy创建引擎时,我应该设置不同的pool\u recycle或connect\u超时值。除了pool\u timeout=30、pool\u recycle=1800之外,我对所有参数都使用默认值

由于这是在应用程序运行大约一个小时后发生的,我想知道连接是否被断开(通过pg db),但SQLAlchemy仍在尝试使用它们

二,。 我是否应该担心键盘错误?或者这是代码中的预期路径。我倾向于它是一个预期,因为它是由除块等捕获

三,。 我应该在查询级别处理BrokenPipeError吗?i、 e.类似于:

retry = 0
while retry<3:
try:
    session.query(....
    break
except BrokenPipeError:
    retry += 1
    continue
重试=0

重试时执行查询时可能正在关闭管道。根据另一个stackoverflow线程,这是一个常见的问题。 这里有一个简短的总结:

断开管道错误与所述幻影一样正常,因为读数 进程(头)终止并关闭其管道末端,而 编写过程(python)仍在尝试编写


可能是在执行查询时关闭管道。根据另一个stackoverflow线程,这是一个常见的问题。 这里有一个简短的总结:

断开管道错误与所述幻影一样正常,因为读数 进程(头)终止并关闭其管道末端,而 编写过程(python)仍在尝试编写


我没有正确地确定sqlalchemy会话的范围,如下所述:

具体来说,我使用的是作用域_会话,但我没有使用@app.teardown_上下文装饰器删除会话

我一直在用mysql数据库做这件事,但在切换到pgsql时就忘了做这件事


修复此问题后,问题得到了纠正。

我没有按照下面的描述正确确定sqlalchemy会话的范围:

具体来说,我使用的是作用域_会话,但我没有使用@app.teardown_上下文装饰器删除会话

我一直在用mysql数据库做这件事,但在切换到pgsql时就忘了做这件事


解决了这个问题。

我也有同样的错误。。很高兴知道我不是一个人。我正在考虑从pg8000转换过来。gcp示例中使用的是这个库,但在SQLAlchemy页面上,他们说他们不推荐pg8000,因为他们没有测试itI,但有完全相同的错误。。很高兴知道我不是一个人。我正在考虑从pg8000转换过来。gcp示例中使用的是这个库,但是在SQLAlchemy页面上,他们说他们不推荐pg8000,因为他们没有测试它
retry = 0
while retry<3:
try:
    session.query(....
    break
except BrokenPipeError:
    retry += 1
    continue