人脸识别程序中向SQLite数据库写入当前检测时间的最优方案及报错解决
解决SQLite写入当前时间的报错与最优实现
嘿,我来帮你搞定这个问题!你碰到的sqlite3.OperationalError: no such function: GETDATE报错很明确——SQLite并不支持SQL Server里的GETDATE()函数,它有自己的内置工具来获取当前时间。下面我给你讲几种靠谱的实现方式,顺便优化下你的代码(还能避免SQL注入风险):
错误原因拆解
SQLite和SQL Server是不同的数据库系统,函数体系不一样。GETDATE()是SQL Server的专属函数,SQLite不认它,所以直接用就会报错。
最优实现方案
方式1:用SQLite内置的datetime('now')直接生成时间
这是最省事的方式,让数据库自己生成当前时间,还能把你原来的两个UPDATE操作合并成一条,减少数据库交互次数:
import sqlite3 import datetime student = getStudent(ID) connection = sqlite3.connect(r"/Users/...../Documents/...../FaceBase.db") # 合并更新考勤状态和时间,用?做占位符避免SQL注入 update_command = "UPDATE Class SET Attendance='Present', Time = datetime('now') WHERE ID=?" # 把ID作为参数传递,别直接拼字符串! cursor = connection.execute(update_command, (ID,)) connection.commit() connection.close()
如果需要本地时间而非UTC时间,把datetime('now')改成datetime('now', 'localtime')就行。
方式2:在Python里生成时间再传入数据库
要是你想在代码层面统一处理时间(比如做时区转换、自定义格式),可以先在Python里生成时间字符串,再传给数据库:
import sqlite3 import datetime student = getStudent(ID) connection = sqlite3.connect(r"/Users/...../Documents/...../FaceBase.db") # 生成你需要的时间格式,这里用常用的YYYY-MM-DD HH:MM:SS current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") update_command = "UPDATE Class SET Attendance='Present', Time = ? WHERE ID=?" cursor = connection.execute(update_command, (current_time, ID)) connection.commit() connection.close()
额外的优化小技巧
- 杜绝SQL注入:千万别像之前那样直接用
"WHERE ID="+str(ID)拼接SQL语句,用?作为占位符传递参数才是安全的做法,能防止恶意ID带来的注入风险。 - 用上下文管理器管理连接:用
with语句可以自动帮你处理连接的打开和关闭,还能自动提交事务(除非出错),省心又安全:
import sqlite3 import datetime student = getStudent(ID) db_path = r"/Users/...../Documents/...../FaceBase.db" with sqlite3.connect(db_path) as connection: update_command = "UPDATE Class SET Attendance='Present', Time = datetime('now') WHERE ID=?" connection.execute(update_command, (ID,)) # 不用手动commit和close,with块会自动处理
小补充:SQLite常用日期函数
除了datetime('now'),SQLite还有这些好用的日期时间函数:
CURRENT_TIMESTAMP:和datetime('now')效果一样,返回ISO格式的UTC时间date('now'):只获取当前日期部分(比如2024-05-20)time('now'):只获取当前时间部分(比如14:30:00)
内容的提问来源于stack exchange,提问作者Mace Winuu
相关产品推荐
相关产品推荐

