在Python中使用SQLite3时,报错:数据库错误: Incorrect number of bindings supplied. The current statement uses 1, and there are 21 supplied.
问题描述
在Python中对SQLite3数据库进行CRUD操作时,报错:数据库错误: Incorrect number of bindings supplied. The current statement uses 1, and there are 21 supplied.
原始代码:
# 连接到SQLite数据库
conn = sqlite3.connect('cose.db')
cursor = conn.cursor()
# 编写SQL删除语句
# 注意:这里我们使用元组来传递参数,以防止SQL注入攻击
delete_sql = "DELETE FROM results WHERE url = ?"
try:
# 执行删除语句
cursor.execute(delete_sql, url)
conn.commit() # 提交事务
logger.info("数据删除成功")
except sqlite3.Error as e:
logger.info(f"数据库错误: {e}")
conn.rollback() # 如果出现错误,回滚事务
finally:
# 关闭游标和连接
cursor.close()
conn.close()
原因
在执行语句cursor.execute(delete_sql, url)
中,url
是一个字符串,它会认为有len(url)
个参数, 与前面语句delete_sql = "DELETE FROM results WHERE url = ?"
定义的参数个数不一致,必须修改成以下形式:
# 执行删除语句
cursor.execute(delete_sql, (url,))
完整的代码:
# 连接到SQLite数据库
conn = sqlite3.connect('cose.db')
cursor = conn.cursor()
# 编写SQL删除语句
# 注意:这里我们使用元组来传递参数,以防止SQL注入攻击
delete_sql = "DELETE FROM results WHERE url = ?"
try:
# 执行删除语句
cursor.execute(delete_sql, (url,))
conn.commit() # 提交事务
logger.info("数据删除成功")
except sqlite3.Error as e:
logger.info(f"数据库错误: {e}")
conn.rollback() # 如果出现错误,回滚事务
finally:
# 关闭游标和连接
cursor.close()
conn.close()