酒店数据库预订更新:删除今日及之前数据遇参数类型不支持错误
问题排查与解决
错误原因分析
- 参数传递格式错误:
sqlite3.Cursor.execute()的第二个参数必须是序列类型(元组/列表),哪怕只有一个参数,也需要包装成元组或列表。你直接传入单个date对象,触发了类型不支持的错误。 - 日期格式化无效且格式错误:你调用了
strftime("%d-%M-%Y")但没有把结果赋值给变量,这行代码完全无效;同时%M代表的是分钟,不是月份,正确的月份占位符是%m。
修正后的代码方案
方案一:直接传递Python Date对象(推荐)
SQLite原生支持Python的date类型,无需手动格式化字符串,更简洁可靠:
import datetime import sqlite3 # 获取今日日期(date类型) dat_danas = datetime.datetime.today().date() # 连接数据库并执行删除 conn = sqlite3.connect("rezervacije.db") cursor = conn.cursor() query = "DELETE FROM infoGosti WHERE DATE(odl_fld) <= ?" # 将单个参数包装成元组(注意末尾的逗号,确保是元组而非单个值) cursor.execute(query, (dat_danas,)) conn.commit() conn.close() # 关闭连接释放资源
方案二:手动格式化日期字符串
如果需要用字符串格式传递日期,需修正格式并保存格式化结果:
import datetime import sqlite3 dat_danas = datetime.datetime.today().date() # 修正格式为%d-%m-%Y(日-月-年),并赋值给变量 formatted_date = dat_danas.strftime("%d-%m-%Y") conn = sqlite3.connect("rezervacije.db") cursor = conn.cursor() query = "DELETE FROM infoGosti WHERE DATE(odl_fld) <= ?" cursor.execute(query, (formatted_date,)) conn.commit() conn.close()
关键注意点
- 永远确保
execute()的参数是序列类型,单个参数必须写成(value,)(末尾逗号不能少),否则会被识别为单个值而非元组。 - 日期格式化时注意占位符的含义:
%Y(4位年份)、%m(2位月份)、%d(2位日期),不要和%M(分钟)混淆。
内容的提问来源于stack exchange,提问作者t0bi
相关产品推荐
相关产品推荐

