2016-04-07 25 views
2

JSONBオブジェクト(JSONを格納するための構造化フォーマット)にdatetimeオブジェクトをSQLAlchemyを使用してPostgreSQL 9.5.2に含めることは可能ですか?PostgreSQLのJSONBのdatetimeオブジェクト

from sqlalchemy.dialects.postgresql import JSONB 
from datetime import datetime 

class Object(Base): 
    __tablename__ = 'object' 
    id = Column(Integer, primary_key=True) 
    attributes = Column(JSONB, nullable=False) 

とデータベースに挿入します。

with transaction.manager: 
    object = Object(attributes = {'name': 'miss piggy', 
            'created': datetime.now()}) 
    session.add(object) 
session.commit() 

は私に次のエラーを与える:

StatementError: (builtins.TypeError) 
datetime.datetime(2016, 4, 7, 9, 51, 9, 893315) is not JSON serializable 

[SQL: 'INSERT INTO object (attributes) VALUES (%(attributes)s)RETURNING object.id'] 
[parameters: [ 
    {'attributes': {'name': 'miss piggy', 
        'created': datetime.datetime(2016, 4, 7, 9, 51, 9, 893315)}}]] 
+0

いいえ、直接ではなく。文字列(または辞書)として格納してから、それが日時であることを特定するための特殊な解析ロジックを実行できます。 – univerio

答えて

0

univerioの助言で、問題を解決するには、以下の機能がA作成します日時オブジェクトからの辞書とその逆:

def DictDatetime(t): 
    dl = ['Y','m','d','H','M','S','f'] 
    if type(t) is datetime: 
     return {a: t.strftime('%{}'.format(a)) for a in dl} 
    elif type(t) is dict: 
     return datetime.strptime(''.join(t[a] for a in dl),'%Y%m%d%H%M%S%f') 

アプリケーション:

# Create datetime object 
a = datetime.now() 
# Convert datetime object to dictionary 
b = DictDatetime(a) 
# Convert dictionary to datetime object 
c = DictDatetime(b) 

チェック:

a == c 

戻り値:True

関連する問題