簡體   English   中英

psycopg2:如何傳遞VARIADIC ARGS?

[英]psycopg2: how to pass VARIADIC ARGS?

我正在嘗試調用接受可變參數的函數json_extract_path psycopg2 是否支持f(%s, %s, ...)形式的查詢,它會接受可變數量的參數?

答案是……基本上沒有,但有點是。

psycopg2 沒有變量參數的占位符,AFAIK 它根本不解析“格式字符串”,所以它不知道使用上下文,它只會愚蠢地將“數據”轉義和格式規則應用於單個參數,所以你需要使用正確數量的占位符創建 SQL/格式字符串,然后將您的序列展平為“頂級”參數。

然而, 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]
)

(注意:代碼未經測試)

  • SQL.format 驗證格式化參數是Composable ,因此它們已顯式標記為安全
  • sql.Placeholder()%sComposable版本(它可以采用可選名稱),如您所見,它也支持“splatting”,專門用於參數數量可變的情況,例如VALUES枚舉或函數調用
  • SQL.joinComposable的版本str.join
  • 然后你可以正常傳遞你的參數,把你的序列“壓平”它們

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',)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM