首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >psycopg2:如何通过VARIADIC ARGS?

psycopg2:如何通过VARIADIC ARGS?
EN

Stack Overflow用户
提问于 2020-11-16 10:25:16
回答 2查看 119关注 0票数 0

我试图调用函数json_extract_path,它接受各种参数。psycopg2是否支持表单f(%s, %s, ...)的查询,这些查询将接受可变数量的参数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-16 14:00:14

SQL格式的答案有效,但我认为它比您需要的要复杂得多。只需添加VARIADIC关键字并将您的参数作为列表发送。使用json_extract_path中的示例:

代码语言:javascript
复制
>>> cur.execute('''SELECT json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', VARIADIC %s)''', [['f4', 'f6']])
>>> cur.fetchall()
[('foo',)]
票数 1
EN

Stack Overflow用户

发布于 2020-11-16 10:36:48

答案是..。基本上没有,但有点肯定。

psycopg2没有变量参数的占位符,AFAIK根本不解析“格式字符串”,因此它根本不知道使用的上下文,它只会愚蠢地将“数据”转义和格式化规则应用于单个参数,因此您需要创建一个具有正确占位符数量的SQL / format字符串,然后将您的序列作为“顶级”参数。

但是,psycopg2 2.7添加了一个psycopg2.sql模块,它可以帮助进行“动态”SQL组合。这里您要做的是使用这些工具来生成查询。

代码语言:javascript
复制
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()

  • SQL.format验证格式化参数是否为Composable,因此它们被标记为安全的str.join

  • then是%sComposable版本(可以使用可选名称),因为您可以看到它也支持“抛出”,特别是对于有可变数量的参数的情况,例如VALUES枚举或函数是str.join
  • then的Composable版本,您可以正常地传递参数,将序列抛到"flatten“,

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64856273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档