代码之家  ›  专栏  ›  技术社区  ›  EMP

如何在python中将datetime作为datetime而不是字符串从sqlite中读取回来?

  •  58
  • EMP  · 技术社区  · 15 年前

    3 回复  |  直到 6 年前
        1
  •  100
  •   Alex Martelli    15 年前

    如果用时间戳类型声明您的列,则说明您在Clover中:

    >>> db = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)
    >>> c = db.cursor()
    >>> c.execute('create table foo (bar integer, baz timestamp)')
    <sqlite3.Cursor object at 0x40fc50>
    >>> c.execute('insert into foo values(?, ?)', (23, datetime.datetime.now()))
    <sqlite3.Cursor object at 0x40fc50>
    >>> c.execute('select * from foo')
    <sqlite3.Cursor object at 0x40fc50>
    >>> c.fetchall()
    [(23, datetime.datetime(2009, 12, 1, 19, 31, 1, 40113))]
    

    看到了吗?int(对于声明为integer的列)和datetime(对于声明为timestamp的列)在往返过程中保持不变,并且类型保持不变。

        2
  •  18
  •   EMP    15 年前

    事实证明,sqlite3可以做到这一点,甚至 documented 有点-但很容易错过或误解。

    我要做的是:

    • 通过 sqlite3.parse列名称 .connect()调用中的选项,例如
    conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
    
    • 将我想要的类型放入查询中——对于datetime,它实际上不是“datetime”,而是“timestamp”:

      sql = 'SELECT jobid, startedTime as "[timestamp]" FROM job'
      
      cursor = conn.cursor()
      try:
          cursor.execute(sql)
          return cursor.fetchall()
      finally:
          cursor.close()
      

    如果我改为传递“datetime”,它将被静默地忽略,我仍然会得到一个字符串。同样,如果我省略了引号。

        3
  •  1
  •   Richard Li    6 年前

    注意:在python3中,我必须将SQL更改为:

    SELECT jobid, startedTime as "st [timestamp]" FROM job

    (我必须明确列的名称。)