Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用psycopg2/Python DB-API和PostgreSQL的参数化查询_Python_Postgresql_Psycopg2 - Fatal编程技术网

使用psycopg2/Python DB-API和PostgreSQL的参数化查询

使用psycopg2/Python DB-API和PostgreSQL的参数化查询,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,让psycopg2将参数化查询传递给PostgreSQL的最佳方法是什么?我不想编写自己的escpaing机制或适配器,psycopg2源代码和示例在web浏览器中很难阅读 如果我需要切换到PyGreSQL或其他python pg适配器之类的东西,我也可以。我只想要简单的参数化。以下是一些您可能会觉得有用的示例 cursor.execute('SELECT * from table where id = %(some_id)d', {'some_id': 1234}) 或者,您可以根据字段名称

让psycopg2将参数化查询传递给PostgreSQL的最佳方法是什么?我不想编写自己的escpaing机制或适配器,psycopg2源代码和示例在web浏览器中很难阅读


如果我需要切换到PyGreSQL或其他python pg适配器之类的东西,我也可以。我只想要简单的参数化。

以下是一些您可能会觉得有用的示例

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注入的影响。

psycopg2
遵循DB-API 2.0的规则(在中设置)。这意味着您可以从
cursor
对象调用
execute
方法,并使用
pyformat
绑定样式,它将为您进行转义。例如,以下各项应是安全的(和工作的):


来自psycopg文档

()

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

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

SQL=“插入作者(姓名)值(%s);”#注意:无引号

data=(“O'Reilly”)

cur.execute(SQL,data)#注意:没有%operator


你想要什么样的参数化?伪代码示例将非常有用。请注意,您可能希望了解SQLAlchemy,在某些方面,输入成本可能会稍高,但它确实是一个非常好的ORM。为了将来参考,答案在文档的第一页:在文档中,示例非常简单。没有一个能显示如何对动态值执行更复杂的查询(如更新)。例如:
set height=5,weight=70
Stack Overflow在您试图解决的特定问题中会变得非常有用。例如,查询与更新表等。因此,这里的答案非常通用,尽管标题将我引入其中,但无助于解决我遇到的问题。除非你知道你在做什么,否则你只需将输入输入导入sql查询,因为这是一个SQL injection.downvoted,这是一个让您对SQL敞开大门的建议injection@RandySyring只有当键没有很好地定义和正确的标识符时,才允许SQL注入。这些值仍然被正确地参数化。也就是说,在一般情况下,它会让您接受SQL注入。您的第一个示例不起作用。从文档中:
变量占位符必须始终为%s,即使不同的占位符(例如%d表示整数或%f表示浮点数)看起来更合适
。您使用了
%d
@mascot6699,因为查询是参数化的。好消息是,由于表名为“student”,而不是“students”;即使代码不安全,它也会失败。给你的教训黑帽子:测试你的功绩!
cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s", 
               {"lname": "Robert'); DROP TABLE students;--"})