PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
参数化查询可以替代手动字符串插值,因此不需要进行以下操作:
cursor.execute("SELECT FROM tablename WHERE fieldname = %s" % value)
我们可以做。
cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])
现在,看起来预处理语句在数据库语言中被广泛使用,参数化查询主要用于连接到数据库的编程语言中,尽管我见过一些例外情况。
问题在于询问预编译语句和参数化查询之间的区别容易带来很多混淆。它们的目的显然是相同的,但它们的方法似乎是不同的。然而,有来源表明两者是相同的。MySQLdb和Psycopg2似乎支持参数化查询,但不支持预编译语句(例如,在这里查看MySQLdb以及在postgres驱动的TODO列表或这个回答中查看SQLAlchemy组)。实际上,有一个gist实现了支持预编译语句的Psycopg2游标以及一个简短的解释。还有建议通过子类化Psycopg2的游标对象来手动提供准备好的语句。
我希望能够得到以下问题的权威答案:
准备语句和参数化查询之间有意义的区别吗?在实践中,这是否重要?如果使用参数化查询,需要担心准备语句吗?
如果有区别,Python生态系统中准备语句的当前状态是什么?哪些数据库适配器支持准备语句?