有一个通用的方法可以将任何可序列化的Python对象存储在sqlite表中。
下面是将datetime.time对象存储在sqlite表中的代码示例:
import sqlite3
import datetime as DT
def adapt_timeobj(timeobj):
return ((3600*timeobj.hour + 60*timeobj.minute + timeobj.second)*10**6
+ timeobj.microsecond)
def convert_timeobj(val):
val = int(val)
hour, val = divmod(val, 3600*10**6)
minute, val = divmod(val, 60*10**6)
second, val = divmod(val, 10**6)
microsecond = int(val)
return DT.time(hour, minute, second, microsecond)
sqlite3.register_adapter(DT.time, adapt_timeobj)
sqlite3.register_converter("timeobj", convert_timeobj)
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.cursor()
cur.execute("create table test (timecol timeobj)")
cur.executemany("insert into test (timecol) values (?)",
[(DT.time(1,2,3,4), ), (DT.time(5,6,7,8),) ])
您可以在SQL中使用不等式,但请注意被比较的值是由adapt_timeobj
返回的,而不是datetime.time
对象。如果adapt_timeobj
函数返回的整数与相应的datetime.time
对象以相同的顺序可排序(就像上面的示例一样),则SQL中的不等式将按预期工作。
cur.execute("select timecol from test where timecol < ?",
[DT.time(4,5,6)])
print(cur.fetchall())
cur.execute("select timecol from test where timecol < ?",
[DT.time(8,0,0)])
print(cur.fetchall())
con.commit()
cur.close()
con.close()
注意:如果您查看编辑历史记录,您会看到一个更简单的替代方案,用
int
而不是
str
存储数据,用于
adapt_timeobj
和
convert_timeobj
。这种方法更简单,但将数据存储为
int
更快且更节省内存。
PARSE_DECLTYPES
不是可选的。 - jfsSELECT timecol [timeobj] ...
的SQL语句。 - unutbuadapt_timeobj
返回的。 - unutbu