sqlite3.ProgrammingError: 提供的绑定数量不正确。当前语句使用了 1 个,而提供的绑定数量为 74 个
- 2024-12-18 08:39:00
- admin 原创
- 165
问题描述:
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()
当我尝试时insert("/gifs/epic-fail-photos-there-i-fixed-it-aww-man-the-tire-pressures-low.gif")
,我收到如标题所示的错误消息(该字符串确实有 74 个字符长)。
代码有什么问题?我该如何修复?
MySQLdb
和许多其他流行的 SQL 库也存在同样的问题。有关详细信息,请参阅为什么在参数化 SQL 查询中尝试使用字符串时会出现“TypeError:字符串格式化期间并非所有参数都已转换”?
解决方案 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])
解决方案 2:
对于我来说,当列数与插入值不一样时就会发生这个问题。
例如:
conn = sqlite3.connect(',ySQL.db')
c = conn.cursor()
sql = "INSERT INTO mytable (X1, X2, X3) VALUES (?,?,?)"
project = (Y1, Y2)
print(project)
c.execute(sql, project)
conn.commit()
conn.close()
这将引发错误,因为 X 的数量(X1、X2、X3)与 Y 的数量(Y1、Y2)不同。因此,您的列数应与插入的值相同。
解决方案 3:
您可能会对以下事实感到困惑:您只处理单列数据,但语法可以同时处理多列,因此需要将字符串转换为元组。
您可以使用以下方法修复它zip
:cursor.execute('INSERT INTO images VALUES(?)', zip(img))
。
为了避免多次execute
调用,您可以将字符串存储在列表中,然后使用以下方法在一次调用中更新表executemany
:
def insert(array):
connection = sqlite3.connect('images.db')
cursor = connection.cursor()
cnt = 0
imgs = []
while cnt != len(array):
img = array[cnt]
print(array[cnt])
imgs.append(img)
cnt += 1
cursor.executemany('INSERT INTO images VALUES(?)', zip(imgs))
executemany
面向行,并将zip
“列”转换imgs
为行
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD