sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 1,提供了 74 个
Posted
技术标签:
【中文标题】sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 1,提供了 74 个【英文标题】:sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 74 supplied 【发布时间】:2013-05-27 05:41:48 【问题描述】:def insert(array):
connection=sqlite3.connect('images.db')
cursor=connection.cursor()
cnt=0
while cnt != len(array):
img = array[cnt]
print(array[cnt])
cursor.execute('INSERT INTO images VALUES(?)', (img))
cnt+= 1
connection.commit()
connection.close()
我不知道为什么这给了我错误,我尝试插入的实际字符串是 74 个字符长,它是:“/gifs/epic-fail-photos-there-i-fixed-it-aww- man-the-tire-pressures-low.gif"
我在插入之前尝试过 str(array[cnt]),但同样的问题发生了,数据库只有一列,这是一个 TEXT 值。
我已经做了好几个小时了,我不知道发生了什么。
【问题讨论】:
【参考方案1】:你需要传入一个序列,但是你忘了用逗号把你的参数变成一个元组:
cursor.execute('INSERT INTO images VALUES(?)', (img,))
没有逗号,(img)
只是一个分组表达式,而不是一个元组,因此img
字符串被视为输入序列。如果该字符串有 74 个字符长,那么 Python 会将其视为 74 个单独的绑定值,每个值长一个字符。
>>> len(img)
74
>>> len((img,))
1
如果你觉得更容易阅读,你也可以使用列表文字:
cursor.execute('INSERT INTO images VALUES(?)', [img])
【讨论】:
我们有很多高级程序员都犯了这个错误,所以没必要觉得自己很愚蠢。 :) 这也咬了我一口。如果“高级编码人员”被此愚弄,则意味着它不直观。恕我直言,如果 execute() 只有一个值而不是单值元组,那会更自然吗?在查询中。无论如何,谢谢你的提示! @user465139:str
上的 %
运算符具有这种魔力——它将一个元组视为多个值,但将一个 str
(或任何其他类型的可迭代)视为单个价值。但这导致混淆的次数远多于解决问题的次数,这就是为什么 stdlib 中几乎没有其他任何东西尝试这种魔法的原因。
出于安全考虑也不建议使用%s
- docs.python.org/3/library/sqlite3.html
通过索引键读取一行也会出现同样的问题。必须使用这种违反直觉的格式:cursor.execute("SELECT * FROM Music WHERE OsFileName = ?", (key,))
【参考方案2】:
cursor.execute(sql,array)
只需要两个参数。 它将迭代“数组”对象并匹配?在 sql 字符串中。 (通过完整性检查以避免 sql 注入)
【讨论】:
以上是关于sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 1,提供了 74 个的主要内容,如果未能解决你的问题,请参考以下文章