与psycopg2 / Python的DB-API和PostgreSQL参数化查询(Paramete

2019-07-19 04:08发布

什么是使psycopg2通过参数化查询到PostgreSQL的最佳方式? 我不想写我自己的escpaing机制或适配器和psycopg2的源代码和实例都很难在Web浏览器来阅读。

如果我需要切换到像PyGreSQL或其他蟒蛇PG适配器,这是我没意见。 我只是想简单的参数。

Answer 1:

psycopg2遵循DB-API 2.0(在设定的规则PEP-249 )。 这意味着你可以调用execute从你的方法cursor对象,并使用pyformat结合的风格,它会做转义为您服务。 例如,下面的应该是安全的(工作):

cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s", 
               {"lname": "Robert'); DROP TABLE students;--"})


Answer 2:

从psycopg文档

( http://initd.org/psycopg/docs/usage.html )

警告决不,决不,决不使用Python字符串连接(+)或字符串参数插值(%)将变量传递给一个SQL查询字符串。 甚至在枪口下。

传递变量中的SQL命令的正确的方法是使用execute()方法的第二个参数:

SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes

data = ("O'Reilly", )

cur.execute(SQL, data) # Note: no % operator



Answer 3:

这里有几个例子,你可能会发现有用

cursor.execute('SELECT * from table where id = %(some_id)d', {'some_id': 1234})

或者,你可以根据字段名称,值的字典动态构建查询:

fields = ', '.join(my_dict.keys())
values = ', '.join(['%%(%s)s' % x for x in my_dict])
query = 'INSERT INTO some_table (%s) VALUES (%s)' % (fields, values)
cursor.execute(query, my_dict)

注:该字段必须在你的代码,而不是用户输入来定义,否则就会容易受到SQL注入。



文章来源: Parameterized queries with psycopg2 / Python DB-API and PostgreSQL