2016-04-07 6 views
2

Ist es möglich, ein Objekt datetime in einem JSONB-Objekt (ein strukturiertes Format zum Speichern von JSON) in PostgreSQL 9.5.2 mit SQLAlchemy.Datetime-Objekt in JSONB in ​​PostgreSQL

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) 

und einfügen in die Datenbank:

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

gibt mir die folgende Fehlermeldung:

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

Nein, nicht direkt. Sie können es als String (oder dict) speichern und dann eine spezielle Parsing-Logik ausführen, um zu bestimmen, dass es sich um eine Datetime handelt. – univerio

Antwort

0

Um das Problem zu lösen, mit der Beratung von univerio, die folgende Funktion erstellt ein Wörterbuch von einem Datetime-Objekt und umgekehrt:

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') 

Anwendung:

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

Check:

a == c 

Returns: True