什么是使psycopg2通过参数化查询到PostgreSQL的最佳方式? 我不想写我自己的escpaing机制或适配器和psycopg2的源代码和实例都很难在Web浏览器来阅读。
如果我需要切换到像PyGreSQL或其他蟒蛇PG适配器,这是我没意见。 我只是想简单的参数。
什么是使psycopg2通过参数化查询到PostgreSQL的最佳方式? 我不想写我自己的escpaing机制或适配器和psycopg2的源代码和实例都很难在Web浏览器来阅读。
如果我需要切换到像PyGreSQL或其他蟒蛇PG适配器,这是我没意见。 我只是想简单的参数。
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;--"})
从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
这里有几个例子,你可能会发现有用
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注入。