2009-12-02 9 views
51

私は、Python 2.6.4でsqlite3モジュールを使用してSQLiteデータベースにdatetimeを格納しています。 sqliteは自動的に日付を文字列に変換するので、挿入するのは非常に簡単です。問題は、それを読むときに文字列として戻ってくるのですが、元のdatetimeオブジェクトを再構築する必要があります。これはどうすればいいですか?sqliteからdatetimeをPythonの文字列の代わりにdatetimeとして読み込むには?

答えて

91

あなたは、タイムスタンプの種類を使用して列を宣言する場合は、クローバーにいる:

>>> 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(列が宣言されたタイムスタンプの場合)の両方が、intact型のラウンドトリップで存続します。

+4

ありがとう、アレックス、それは動作します!私はこれに驚いています。なぜなら、http://www.sqlite.org/datatype3.htmlのTIMESTAMP型についての言及が全くないからです。 – EMP

+15

@Evgeny、http://docs.python.org/library/sqlite3を参照してください。 .html#default-adaptors-and-converters - sqlite.orgでは実際にはPython層に実装されているので、sqlite.orgには書かれていません。 –

+12

私は、fetchallがdatetimeを返すようにするconnect関数の__detect_types = sqlite3.PARSE_DECLTYPES__パラメータを調べています。これを省略すると、ユニコードオブジェクトが作成されます。 – Ponytech

17

sqlite3がこれを行うことができ、それはdocumentedでもありますが、見逃したり誤解したりするのはかなり簡単です。私がしなければならなかった何

は次のとおりです。

  • は、例えば、.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"を渡すと、それは暗黙のうちに無視され、私はまだ文字列を返します。引用符を省略した場合も同じです。

+0

フム、あなたには、いくつかのより多くのコードを表示してくださいだろう?私はこれを動作させることができません... – unutbu

+2

それは間違いなく '' [timestamp] ''であり、 '[timestamp]'は暗黙のうちに無視され、 '.fetchone'も型を変換しません。どのような奇妙な図書館。 –

1

注:のpython3では、私のような何かにSQLを変更する必要がありました:

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

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

関連する問題