我用我写的一段代码进行了以下(相对(简单的调用:
pickups = session.query(Pickup).filter(Pickup.firebase_run_id == run_id).all()
我对这段代码进行了两组集成测试,一组在本地运行,使用psycops2
和TLS,另一组在GCP开发环境(GCP云函数(中运行,并使用pg8000
和UNIX套接字(GCP强制(?(云函数通过UNIX套接字连接到cloud SQL,请参阅此处(。本地集成测试运行良好。然而,开发测试确实失败了,并出现以下错误:
Traceback (most recent call last):
File "/user_code/main.py", line 245, in GET_run
response = run_get(run_id)
File "/user_code/rubbish_geo_client/ops.py", line 686, in run_get
pickups = session.query(Pickup).filter(Pickup.firebase_run_id == run_id).all()
File "/env/local/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3319, in all
return list(self)
File "/env/local/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3481, in __iter__
return self._execute_and_instances(context)
File "/env/local/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3503, in _execute_and_instances
querycontext, self._connection_from_session, close_with_result=True
TypeError: expected bytes, str found
这个特定的函数调用实际上只是这种失败的一个例子;我所有的数据库调用都失败了,出现了相同的_execute_and_instances
错误!
也许有人已经了解了解决这个问题的方法是什么?
pg8000
在其实现中有一个长期存在的错误,sqlalchemy
驱动程序刚刚修复了这个错误。新的pg8000
维护人员最近为这个问题推出了一个补丁,并发布了包含该修复程序的pg8000
的新版本。不幸的是,这产生了破坏sqlalchemy
解决方法的副作用。
在sqlalchemy
更改其驱动程序以尊重此补丁之前,目前最好的解决方案是将pg8000
从1.16.6降级到1.16.5或更低。
您可以使用pip install pg8000<=1.16.5
执行此操作。
参考以下对话:GH#commitcomment-43174891,GH#53。
pg8000在SQLAlchemy 1.4+中受支持。
围绕的替代工作
pool.dialect.description_encoding = None
来源:https://github.com/sqlalchemy/sqlalchemy/issues/5645#issuecomment-707879323https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/cloud-sql/postgres/sqlalchemy/main.py