在Python说明文档中推荐使用? 占位符(placeholder)来代替字符串操作,原文如下:
通常你的 SQL 操作需要使用一些 Python 变量的值。你不应该使用 Python 的字符串操作来创建你的查询语句,因为那样做不安全;它会使你的程序容易受到 SQL 注入攻击。
推荐另外一种方法:使用 DB-API 的参数替换。在你的 SQL 语句中,使用 ? 占位符来代替值,然后把对应的值组成的元组做为 execute() 方法的第二个参数。
除了注意使用元组传递参数外,笔者还遇到了另外一个陷阱。
程序如下
import sqlite3
seeds=sqlite3.connect(r'C:\Users\VC\OneDrive\python2019\DM\mine.db')
fptree=seeds.cursor()
yellowleaf='ZAJB1040'
support='freq'
freq_x=fptree.execute('''SELECT ? FROM btree WHERE doc_code=?''',(support,),(yellowleaf,)).fetchone()
print(freq_x[0])
运行之后报错如下:
Traceback (most recent call last):
File "c:/Users/VC/OneDrive/python2019/DM/test.py", line 7, in <module>
freq_x=fptree.execute('''SELECT ? FROM btree WHERE doc_code=?''',(support,),(yellowleaf,)).fetchone()
TypeError: function takes at most 2 arguments (3 given)
TypeError: function takes at most 2 arguments (3 given)的错误在stack overflow等社区也常有人问及,看来入坑的不在少数,但解答很少在点子上。
经过研究,原来?占位符只能代替普通值,不能用来代替列名或者表名。即第二个?占位符是合法的,而第一个?占位符则是问题所在。