我试图调用函数json_extract_path,它接受各种参数。psycopg2是否支持表单f(%s, %s, ...)的查询,这些查询将接受可变数量的参数?
发布于 2020-11-16 14:00:14
SQL格式的答案有效,但我认为它比您需要的要复杂得多。只需添加VARIADIC关键字并将您的参数作为列表发送。使用json_extract_path中的示例:
>>> cur.execute('''SELECT json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', VARIADIC %s)''', [['f4', 'f6']])
>>> cur.fetchall()
[('foo',)]发布于 2020-11-16 10:36:48
答案是..。基本上没有,但有点肯定。
psycopg2没有变量参数的占位符,AFAIK根本不解析“格式字符串”,因此它根本不知道使用的上下文,它只会愚蠢地将“数据”转义和格式化规则应用于单个参数,因此您需要创建一个具有正确占位符数量的SQL / format字符串,然后将您的序列作为“顶级”参数。
但是,psycopg2 2.7添加了一个psycopg2.sql模块,它可以帮助进行“动态”SQL组合。这里您要做的是使用这些工具来生成查询。
path = ['a', 'b', 'c']
cursor.execute(
sql.SQL('select json_extract_path(col, {}) from table').format(
sql.SQL(', ').join(sql.Placeholder() * len(path))
),
[*path]
)(注:未经测试的代码)
explicitly
sql.Placeholder()
Composable,因此它们被标记为安全的str.join
%s的Composable版本(可以使用可选名称),因为您可以看到它也支持“抛出”,特别是对于有可变数量的参数的情况,例如VALUES枚举或函数是str.joinComposable版本,您可以正常地传递参数,将序列抛到"flatten“,。
https://stackoverflow.com/questions/64856273
复制相似问题