SQLite中的timestamp列返回Python中的字符串

pvcm50d1  于 2023-04-12  发布在  SQLite
关注(0)|答案(2)|浏览(145)

我用SQLite Date Browse应用程序创建了一个表...
当我想从timestamp列中检索datetime值时,SQLite返回unicod类型...

这是我的插入代码:

def Insert(self,mode,path,vname,stime,ftime):
        con = sqlite3.connect(PATH_DataBase)  # @UndefinedVariable
        con.execute('INSERT INTO SendList VALUES(?,?,?,?,?)',(mode,path,vname,stime,ftime))
        con.commit()
        con.close()

dt1 = datetime.datetime(2013,01,01,01,01,01,0)
dt2 = datetime.datetime(2015,01,01,01,01,01,0)
c = 0
    for f in os.listdir('/home/abbas/test/'):
        c += 1
        slist.Insert(common.MODE_Bluetooth_JAVA, '/home/abbas/test/'+f,'flower'+str(c) , dt1, dt2)

这是我的table:

但是当我想比较starttime与datetime.now()python给予我错误:
TypeError: can't compare datetime.datetime to unicode

cpjpxq1n

cpjpxq1n1#

“SQLite没有专门用于存储日期和/或时间的存储类。”参考:https://www.sqlite.org/datatype3.html
Python的sqlite3模块提供了“datetime模块中的date和datetime类型的默认适配器”。https://docs.python.org/2/library/sqlite3.html#default-adapters-and-converters
唯一的问题是必须确保正确地定义列。示例DDL:

import sqlite3

con = sqlite3.connect(PATH_DataBase, detect_types=sqlite3.PARSE_DECLTYPES)
con.execute('''create table if not exists SendList (
                 cid primary key, 
                 mode text, 
                 path text,
                 vname text,
                 starttime timestamp, 
                 endtime timestamp);''')
con.commit()
con.close()

任何后续的插入或选择数据的连接都必须传递sqlite3.PARSE_DECLTYPES作为关键字参数(aka kwarg)detect_types的值。示例:

import datetime as dt

con = sqlite3.connect(PATH_DataBase, detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.cursor()
cur.execute('''select 
                 *
               from 
                 SendList
               where 
                 starttime between ? and ?
               limit 10;''',
            (dt.datetime(2013,1,1,0,0,0), dt.datetime(2014,12,31,23,59,59)))
results = cur.fetchall()
nle07wnf

nle07wnf2#

我也遇到过类似的问题,但是我的列类型是DATETIME而不是TIMESTAMP。要解决这个问题,我需要使用detect_types = sqlite3.PARSE_DECLTYPESsqlite3.register_converter方法。
我的代码来解决这个问题是:

import sqlite3
sqlite3.register_converter('DATETIME', sqlite3.converters['TIMESTAMP'])
conn = sqlite3.connect("/app/tmp/my_sqlite.db", detect_types=sqlite3.PARSE_DECLTYPES)
query = "SELECT * FROM table_test_2 WHERE dag_id='dag_1'"
cursor = conn.cursor()
cursor.execute(query)
cursor.fetchall()

执行结果:

我使用sqlite3.converters['TIMESTAMP']是因为我想要相同的TIMESTAMP类型的转换器。

相关问题