据我所知,预备语句(主要)是一个数据库功能,允许您将参数与使用此类参数的代码分开.例:
PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
Run Code Online (Sandbox Code Playgroud)
参数化查询替代手动字符串插值,因此不是这样做
cursor.execute("SELECT FROM tablename WHERE fieldname = %s" % value)
Run Code Online (Sandbox Code Playgroud)
我们可以做的
cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])
Run Code Online (Sandbox Code Playgroud)
现在,似乎准备好的语句大部分都用在数据库语言中,参数化查询主要用于连接数据库的编程语言,尽管我已经看到了这个规则的例外.
问题在于询问预准备语句和参数化查询之间的区别会带来很多混乱.他们的目的无疑是相同的,但他们的方法似乎是截然不同的.然而,有消息表明两者都是相同的.MySQLdb和Psycopg2似乎支持参数化查询,但不支持预处理语句(例如,这里是MySQLdb和postgres驱动程序的TODO列表或sqlalchemy 组中的这个答案).实际上,有一个实现psycopg2游标的要点,支持准备好的语句和关于它的最小解释.还有一个建议是在psycopg2中继承游标对象以手动提供准备好的语句.
我想得到以下问题的权威答案:
预准备语句和参数化查询之间是否存在有意义的区别?这在实践中是否重要?如果使用参数化查询,是否需要担心预处理语句?
如果存在差异,Python生态系统中预准备语句的当前状态是什么?哪些数据库适配器支持预处理语
python database sql-injection prepared-statement parameterized-query
我有一段Python代码,它通过psycopg与PostgreSQL数据库交互.
所有文献都警告不要自己进行sql格式化,并建议让驱动程序这样做.例如:
cur.execute('select name, age from people where name = %s;', ('ann',) )
Run Code Online (Sandbox Code Playgroud)
然后驱动程序格式化sql字符串.假设我不想执行任何操作,但我只想要完全格式化的sql字符串.是否有任何功能可以在psycopg模块中获取此格式化的sql?