Python执行SQLite查询返回重复结果问题求助
解决SQLite查询结果重复输出的问题
问题分析
从你的输出可以看到,查询结果列表被打印了两次,这通常不是数据库返回了重复记录,而是你的print(read_query(q1))语句被执行了两次;当然也需要先确认数据库中是否真的存在两条记录。
解决方案步骤
1. 先确认数据库中的实际记录数
打开终端执行以下命令,直接查询目标日期的记录数量:
sqlite3 database.db "SELECT COUNT(*) FROM bookings WHERE strftime('%Y-%m-%d', booked_time) = '2023-09-04';"
- 如果返回结果是
1:说明数据库中只有一条记录,重复输出是代码执行两次导致的。 - 如果返回结果是
2:说明数据库中确实有两条记录,需要检查插入逻辑。
2. 解决代码重复执行的问题
如果数据库中只有一条记录,大概率是你的查询代码被执行了两次,比如:
- 你的
schedule.py被其他文件(如Flask的app文件)导入,导致顶层的print语句在导入时执行了一次,直接运行schedule.py时又执行一次。 - 修复方法:将查询和打印代码放入
if __name__ == '__main__':块中,确保只有直接运行该文件时才执行:
from flask import request import sqlite3 def read_query(query): # 用上下文管理器优化连接,自动关闭 with sqlite3.connect("database.db") as con: cur = con.cursor() cur.execute(query) result = cur.fetchall() return result # 仅在直接运行该文件时执行查询和打印 if __name__ == '__main__': q1 = """ SELECT email,booked_time,strftime('%Y-%m-%d',booked_time) as 'date' FROM bookings WHERE date = DATE('2023-09-04'); """ print(read_query(q1))
3. 排查数据库重复记录的可能(如果步骤1返回2)
虽然你的booked_time字段设置了UNIQUE约束,但如果插入的时间字符串存在细微差异(比如末尾空格、格式不一致),SQLite会认为是不同的值,从而允许插入。执行以下命令查看具体的booked_time值:
sqlite3 database.db "SELECT id, booked_time FROM bookings WHERE strftime('%Y-%m-%d', booked_time) = '2023-09-04';"
- 如果发现
booked_time有差异,检查Flask插入代码中的booked_time拼接逻辑,确保格式统一:# 改用datetime格式化,避免拼接错误 from datetime import datetime booked_time = datetime.strptime(f"{date} {hour}:{minutes}", "%Y-%m-%d %H:%M").strftime("%Y-%m-%d %H:%M:%S") - 另外,Flask的
process函数中con.close()在return msg之后,永远不会执行,但这不影响插入,上下文管理器已经自动处理了资源释放。
4. 优化查询语句(可选)
你的查询语句中使用了别名date作为WHERE条件,SQLite支持这种写法,但更严谨的写法可以直接在WHERE子句中处理,避免歧义:
SELECT email, booked_time, strftime('%Y-%m-%d', booked_time) as date FROM bookings WHERE strftime('%Y-%m-%d', booked_time) = '2023-09-04';
内容的提问来源于stack exchange,提问作者Liam W
相关产品推荐
相关产品推荐

