Python+;博士后&x2B;psycopg2:编写动态json查询并处理引号

Python+;博士后&x2B;psycopg2:编写动态json查询并处理引号,python,json,postgresql,psycopg2,Python,Json,Postgresql,Psycopg2,我正在尝试使用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 *

我正在尝试使用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\u子句=where\u子句+“data@>\“{%s:%s}\”和“

我得到的是:

where data@>“{'favorite_topping':'pepperoni'}”

这是失败的,因为Postgres希望引用的是另一种方式,比如:

where data@>'{“最爱的”配料“:“辣味香肠”}'


有什么方法可以实现这一点吗?

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


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

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


您可以通过使用常规字符串格式来解决此问题,但请确保自己验证/清理/转义查询参数,以避免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'})

主要基于中的信息。

这将解决您的问题:

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'})

主要基于。

中的信息,是否至少有一种方法可以让它用双引号而不是单引号引用favorite_Toping?是否至少有一种方法可以让它用双引号而不是单引号引用favorite_Toping?