sqlalchemy ORM call fails with TypeError: expected bytes, str found
sqlalchemy ORM call fails with TypeError: expected bytes, str found
我正在用我编写的一些代码进行以下(相对)简单的调用:
pickups = session.query(Pickup).filter(Pickup.firebase_run_id == run_id).all()
我对该代码进行了两组集成测试,一组在本地 运行s 并使用 psycops2
和 TLS,另一组在 GCP 开发环境中 运行s ( GCP 云功能)并使用 pg8000
和 UNIX 套接字(GCP 要求(?)云功能通过 UNIX 套接字连接到云 SQL——参见 here)。本地集成测试 运行 正常。但是,开发测试可靠地失败并出现以下错误:
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
。不幸的是,这 side-effect 打破了 sqlalchemy
解决方法。
直到 sqlalchemy
更改其驱动程序以遵守此补丁,目前最好的解决方案是将 pg8000
从 1.16.6 降级到 1.16.5 或更低版本。
您可以使用 pip install pg8000<=1.16.5
。
参考以下对话:GH#commitcomment-43174891, GH#53.
pg8000 is supported 在 SQLAlchemy 1.4+ 中。
替代解决方法
pool.dialect.description_encoding = None
来源:
https://github.com/sqlalchemy/sqlalchemy/issues/5645#issuecomment-707879323
https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/cloud-sql/postgres/sqlalchemy/main.py
我正在用我编写的一些代码进行以下(相对)简单的调用:
pickups = session.query(Pickup).filter(Pickup.firebase_run_id == run_id).all()
我对该代码进行了两组集成测试,一组在本地 运行s 并使用 psycops2
和 TLS,另一组在 GCP 开发环境中 运行s ( GCP 云功能)并使用 pg8000
和 UNIX 套接字(GCP 要求(?)云功能通过 UNIX 套接字连接到云 SQL——参见 here)。本地集成测试 运行 正常。但是,开发测试可靠地失败并出现以下错误:
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
。不幸的是,这 side-effect 打破了 sqlalchemy
解决方法。
直到 sqlalchemy
更改其驱动程序以遵守此补丁,目前最好的解决方案是将 pg8000
从 1.16.6 降级到 1.16.5 或更低版本。
您可以使用 pip install pg8000<=1.16.5
。
参考以下对话:GH#commitcomment-43174891, GH#53.
pg8000 is supported 在 SQLAlchemy 1.4+ 中。
替代解决方法
pool.dialect.description_encoding = None
来源: https://github.com/sqlalchemy/sqlalchemy/issues/5645#issuecomment-707879323 https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/cloud-sql/postgres/sqlalchemy/main.py