据我所知,prepared语句(主要)是一种数据库功能,允许您将参数与使用此类参数的代码分离.例子:
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])
现在,似乎大部分预准备语句都用在数据库语言中,参数化查询主要用在连接到数据库的编程语言中,尽管我看到了这条规则的例外情况.
问题是,询问预准备语句和参数化查询之间的区别会带来很多念力.诚然,他们的目的是相同的,但他们的方法似乎截然不同.然而,有sources个表明两者是相同的.MySQLdb和Mental copg2似乎支持参数化查询,但不支持预准备语句(例如,MySQLdb为here,sqlalChemy组中为TODO list for postgres drivers或this answer).实际上,有一个gist实现了一个支持预准备语句的mental copg2游标,最小explanation个实现了这个游标.还有一种方法是在mental copg2中对游标对象进行子类化,以手动提供准备好的语句.
我想得到以下问题的权威答案:
预准备语句和参数化查询之间有意义的区别吗?这在实践中重要吗?如果使用参数化查询,是否需要担心预准备语句?
如果存在差异,那么Python生态系统中预准备语句的当前状态如何?哪些数据库适配器支持预准备语句?