本地正常运行的Python云函数报错:缺少必需位置参数query
问题描述
- Python函数本地运行正常,部署到Cloud Function后报错:
missing 1 required positional arguments : query - 问题始于2023年1月27日,此前云函数运行正常;新部署/重新部署的新旧函数均触发错误,2023年1月27日前部署的函数可正常运行
- 使用SQLAlchemy创建数据库连接的代码如下:
from sqlalchemy.engine.url import URL url = URL( drivername="mysql+pymysql", username="user", password="1234", host="localhost", port=3306, database="db_1" )
- 报错回溯信息:
Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.7/site-packages/flask/app.py", line 2073, in wsgi_app response = self.full_dispatch_request() File "/layers/google.python.pip/pip/lib/python3.7/site-packages/flask/app.py", line 1518, in full_dispatch_request rv = self.handle_user_exception(e) File "/layers/google.python.pip/pip/lib/python3.7/site-packages/flask/app.py", line 1516, in full_dispatch_request rv = self.dispatch_request() File "/layers/google.python.pip/pip/lib/python3.7/site-packages/flask/app.py", line 1502, in get_DBConn_new engine = conn.get_connection_new() File "DBConnDetails.py", line 13, in get_connection_new database = const.database TypeError: __new__() missing 1 required positional argument: 'query'
问题分析与解决
核心原因是Cloud Function环境中自动安装的SQLAlchemy版本更新到了2.0+,该版本对URL类的实例化规则做了变更:旧版本(1.4及以下)允许省略query参数直接实例化,2.0+版本则要求必须传入该参数,或改用官方推荐的构造方法。
有两种可行的解决方式:
方式一:适配SQLAlchemy 2.0+的实例化逻辑
方法1:显式传入query参数
在创建URL对象时直接传入query参数,可设为None或空字典:
from sqlalchemy.engine.url import URL url = URL( drivername="mysql+pymysql", username="user", password="1234", host="localhost", port=3306, database="db_1", query=None )
方法2:使用官方推荐的URL.create()方法
SQLAlchemy 2.0+官方推荐用create类方法构建URL,兼容性更强:
from sqlalchemy.engine.url import URL url = URL.create( drivername="mysql+pymysql", username="user", password="1234", host="localhost", port=3306, database="db_1" )
方式二:固定SQLAlchemy版本到旧版
在项目的requirements.txt中指定SQLAlchemy为1.4.x系列版本,强制Cloud Function安装兼容旧代码的版本:
sqlalchemy==1.4.46 pymysql flask
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

