Python+;博士后&x2B;psycopg2:编写动态json查询并处理引号
我正在尝试使用Python和psycopg2驱动程序在Postgres中编写一个涉及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 *
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?