web-dev-qa-db-ja.com

Pythonで文字列ではなく日付時刻としてsqliteから日付時刻を読み取る方法は?

Python 2.6.4でsqlite3モジュールを使用しています。SQLiteデータベースに日時を保存します。sqliteは日付を文字列に自動的に変換するため、挿入は非常に簡単です。問題は、読み込むと文字列として返されますが、元の日時オブジェクトを再構築する必要があります。

61
EMP

タイプのタイムスタンプを使用して列を宣言すると、クローバーになります。

>>> 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(整数で宣言された列の場合)とdatetime(タイムスタンプで宣言された列の場合)の両方が、型をそのままにしてラウンドトリップを生き残ります。

105
Alex Martelli

Sqlite3はこれを行うことができ、それも ドキュメント化された のようなものであることがわかりましたが、見逃したり誤解したりするのは非常に簡単です。

私がしなければならなかったことは:

  • .connect()呼び出しでsqlite3.PARSE_COLNAMESオプションを渡します。
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
  • 希望するタイプをクエリに入力します-日時については、実際には「日時」ではなく「タイムスタンプ」です:

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

代わりに「datetime」を渡すと、暗黙のうちに無視され、文字列が返されます。引用符を省略した場合も同じです。

20
EMP

注:Python3では、SQLを次のようなものに変更する必要がありました。

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

(列に明示的に名前を付ける必要がありました。)

1
Richard Li