[英]Flask dynamic Google Maps markers (python, postgres, psycopg2)
[英]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'})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.