You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

酒店数据库预订更新:删除今日及之前数据遇参数类型不支持错误

问题排查与解决

错误原因分析

  1. 参数传递格式错误:sqlite3.Cursor.execute()的第二个参数必须是序列类型(元组/列表),哪怕只有一个参数,也需要包装成元组或列表。你直接传入单个date对象,触发了类型不支持的错误。
  2. 日期格式化无效且格式错误:你调用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:55:46