繁体   English   中英

Python + Postgres + psycopg2:编写动态json查询并处理引号

[英]Python + Postgres + psycopg2 : Composing a dynamic json query and dealing with quotes

我正在尝试使用Python和psycopg2驱动程序编写一个涉及Postgres中json列的动态查询。

where_clause = ''
parameters = []

for key, v in (arguments):
    parameters.append(key)
    parameters.append(v)
    where_clause = where_clause + "data @> '{\"%s\":%s}' AND "

sql = u'select * from my_table where ' + where_clause + ' 1 = 1
db = connect(connection_string)
cur = db.cursor()
cur.execute(sql, tuple(parameters))
rows = cur.fetchall()
cur.close()
db.close()

当我这样做时,它有'{\\"%s\\":%s}'

psycopg2.ProgrammingError: syntax error at or near "favorite_topping"
LINE 1: select * from my_table where data @> '{"'favorite_topping'":'pepperoni'...

它不喜欢我如何安排报价。

问题似乎是psycopg2在组成最终查询时如何选择插入引号。

更新

如果我这样做: where_clause = where_clause + "data @> \\"{%s:%s}\\" AND "

我得到的是这个:

where data @> "{'favorite_topping':'pepperoni'}"

而失败是因为Postgres想要的是引用是相反的,如下所示:

where data @> '{"favorite_topping":"pepperoni"}'

有没有办法让这种情况发生?

这是查询参数化的工作方式 - 数据库驱动程序将查询参数的类型确定为字符串,并自动在转义值周围放置引号。

您可以使用常规字符串格式来解决此问题,但请确保自己验证/清理/转义查询参数以避免SQL注入攻击和平衡引号问题。

这应该可以解决您的问题:

from psycopg2.extras import Json
from psycopg2.extras import register_default_json
register_default_json(loads=lambda x: x)

query = u'select * from my_table where data @> %s;'
cur.execute(sql, Json({'favorite_topping':'pepperoni'})

主要基于https://github.com/psycopg/psycopg2/issues/190中的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM