2016-04-19 37 views
1

sqlite3に保存されている素朴なdatetimesと意識しているdatetimesを混在させることにいくつかの問題があります。タイムゾーン対応のタイムスタンプをsqlite3にpythonで保存する方法は?

>>> import datetime, pytz 
>>> dt = datetime.datetime.now() 
>>> dt1 = pytz.utc.localize(dt) 
>>> dt < dt1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't compare offset-naive and offset-aware datetimes 

はその後SQLite3の中で、TZが取り除かれる:

>>> conn = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES) 
>>> c = conn.cursor() 
>>> c.execute("CREATE TABLE example (id INTEGER PRIMARY KEY, title text, updated timestamp)") 
<sqlite3.Cursor object at 0x1058855e0> 
>>> conn.commit() 
>>> c.execute("INSERT INTO example VALUES (NULL, ?, ?)", ('naive', datetime.datetime.utcnow())) 
<sqlite3.Cursor object at 0x1058855e0> 
>>> conn.commit() 
>>> c.execute("INSERT INTO example VALUES (NULL, ?, ?)", ('tz-aware', pytz.utc.localize(datetime.datetime.utcnow()))) 
<sqlite3.Cursor object at 0x1058855e0> 
>>> conn.commit() 
>>> c.execute("SELECT * FROM example") 
<sqlite3.Cursor object at 0x1058855e0> 
>>> c.fetchall() 
[(1, u'naive', datetime.datetime(2016, 4, 19, 22, 26, 57, 337504)), (2, u'tz-aware', datetime.datetime(2016, 4, 19, 22, 27, 41, 664158))] 
>>> 

答えて

1

は答えを見つけることが - しかし、矢印を使用して。

>>> import arrow 
>>> def convert_arrowdatetime(s): 
...  return arrow.get(s) 
... 
>>> def adapt_arrowdatetime(adt): 
...  return adt.isoformat() 
... 
>>> sqlite3.register_adapter(arrow.arrow.Arrow, adapt_arrowdatetime) 
>>> sqlite3.register_converter("timestamp", convert_arrowdatetime) 
>>> c.execute("INSERT INTO example VALUES (NULL, ?, ?)", ('tz-aware', pytz.utc.localize(datetime.datetime.utcnow()))) 
<sqlite3.Cursor object at 0x1058855e0> 
>>> conn.commit() 
>>> c.execute("SELECT * FROM example") 
<sqlite3.Cursor object at 0x1058855e0> 
>>> c.fetchall() 
[(1, u'naive', <Arrow [2016-04-19T22:26:57.337504+00:00]>), (2, u'tz-aware', <Arrow [2016-04-19T22:27:41.664158+00:00]>), (3, u'tz-aware', <Arrow [2016-04-19T22:35:12.004054+00:00]>)] 
>>> 
関連する問題