【python】SQLite学习笔记04:占位符?的陷阱

在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等社区也常有人问及,看来入坑的不在少数,但解答很少在点子上。
经过研究,原来?占位符只能代替普通值,不能用来代替列名或者表名。即第二个?占位符是合法的,而第一个?占位符则是问题所在。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狮弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值