PyPika使用Parameter()向查询构建器传参报ValueError如何解决
报错根因
你的代码存在3处问题,直接触发运行错误:
- 未导入
Parameter类,运行时会先抛出NameError - 参数模式与占位符写法不匹配:
Parameter.POSITIONAL_ONLY为位置参数模式,该模式下参数名禁止携带:这类占位符前缀,且无需自定义参数名;你传入的:name不符合命名规则,直接触发ValueError - 末尾函数调用语法错误,多余声明了
def关键字,无法正常执行
正确使用方式
根据你需要的占位符类型,选择对应写法即可:
命名参数(:name 格式)
如果需要生成:name形式的命名占位符,使用Parameter.NAMED模式,不要手动给参数名加冒号,PyPika会自动拼接前缀:
from pypika import functions as fn from pypika import MSSQLQuery, Table, Parameter # 补全Parameter导入 def build_sample_query(name): sample_table = Table('sample') query = MSSQLQuery \ .from_(sample_table) \ .where(sample_table.name == Parameter('name', Parameter.NAMED)) \ .groupby(sample_table.date) \ .select(sample_table.date, fn.Sum(sample_table.itemscount)) print(query.get_sql()) # 数据库执行时按关键字传参即可 # result = db.execute(query, params={"name": name}) # data = result.fetchall() return query # 正确调用函数 build_sample_query('SAMPLENAME')
运行后生成的SQL语句为:
SELECT "date",SUM("itemscount") FROM "sample" WHERE "name"=:name GROUP BY "date"
位置参数(? 格式)
如果使用你原本写的POSITIONAL_ONLY位置参数模式,不需要传入自定义参数名,生成的占位符为?,执行时按元组顺序传参:
from pypika import functions as fn from pypika import MSSQLQuery, Table, Parameter def build_sample_query(name): sample_table = Table('sample') query = MSSQLQuery \ .from_(sample_table) \ .where(sample_table.name == Parameter(None, Parameter.POSITIONAL_ONLY)) \ .groupby(sample_table.date) \ .select(sample_table.date, fn.Sum(sample_table.itemscount)) print(query.get_sql()) # 数据库执行时按位置传参,注意元组单元素要加逗号 # result = db.execute(query, params=(name,)) # data = result.fetchall() return query build_sample_query('SAMPLENAME')
运行后生成的SQL语句为:
SELECT "date",SUM("itemscount") FROM "sample" WHERE "name"=? GROUP BY "date"
注意:PyPika的参数名校验规则中,位置参数类模式(
POSITIONAL_ONLY、QMARK)不接受包含:、@、$等特殊占位符前缀的参数名,所有占位符前缀由对应参数模式自动拼接,手动添加前缀就会触发你遇到的参数名非法报错。
内容的提问来源于stack exchange,提问作者VJ D
相关产品推荐
相关产品推荐

