2013-02-17 13 views
7

Ich habe ein sqlalchemy ErgebnisWie sqlalchemy zu json erstellen

labels = session.query(
     LabelsData, 
     LabelsData.id, 
     LabelsData.name, 
     LabelsData.color 
     ).filter(LabelsData.deleted==False).all() 

Und ich möchte, um dieses Ergebnis zu JSON konvertieren, aber wie kann ich es tun?

+0

umm, [ 'json'] (http: // docs. python.org/2/library/json.html)? –

+2

ja, aber sqlalchemy Ergebnis kann nicht von json codiert :( – Nolik

+0

Sie können Snippet aus meiner Antwort http://stackoverflow.com/questions/7102754/jsonify-a-sqlalchemy-result-set-in-flask/14322313 verwenden # 14322313 – n0nSmoker

Antwort

16

Ihr Objekt LabelsData scheint ein SQLAlchemy-Modell zu sein. Sie müssen es serialisieren, bevor Sie es in JSON ablegen. Hier ist ein kurzes Beispiel, das alle Spalten aus Ihrem LabelsData Objekt extrahiert und wandelt die Ergebnisse der Abfrage zu JSON:

from json import dumps 
from sqlalchemy.orm import class_mapper 

def serialize(model): 
    """Transforms a model into a dictionary which can be dumped to JSON.""" 
    # first we get the names of all the columns on your model 
    columns = [c.key for c in class_mapper(model.__class__).columns] 
    # then we return their values in a dict 
    return dict((c, getattr(model, c)) for c in columns) 

# we can then use this for your particular example 
serialized_labels = [ 
    serialize(label) 
    for label in session.query(LabelsData).filter(LabelsData.deleted == False) 
] 
your_json = dumps(serialized_labels) 
2
from collections import OrderedDict 

class DictSerializable(object): 
    def _asdict(self): 
     result = OrderedDict() 
     for key in self.__mapper__.c.keys(): 
      result[key] = getattr(self, key) 
     return result 

Von here und erscheint simplejson zu verlangen. Hoffe, dass hilft ...

UPDATE: auf einen zweiten Blick, es ist ein Wörterbuch, das Sie können Dump von einem der JSON-Module in Python.

+0

Müssen mit Datetime-Werten umgehen, die nicht direkt serialisiert werden können .. mit etwas wie unten angegeben: def handler (o): wenn hasattr (o, 'isoformat') und aufrufbar (o.isoformat): zurück o .isoformat() raisen TypeError ("% r"% (o,) kann nicht serialisiert werden) jsonize = lambda d: json.Dumps (d, Standard = _handler) Courstey "Thomas Dignan" bei [link] (http://piotr.banaszkiewicz.org/blog/2012/06/30/serialize-sqlalchemy-results-into-json/) – saurshaz

1

Sieht aus wie sqlalchemy bereits ein http://docs.sqlalchemy.org/en/latest/core/serializer.html

from sqlalchemy.ext.serializer import loads, dumps 
metadata = MetaData(bind=some_engine) 
Session = scoped_session(sessionmaker()) 

# ... define mappers 

query = Session.query(MyClass).filter(MyClass.somedata=='foo').order_by(MyClass.sortkey) 

# pickle the query 
serialized = dumps(query) 

# unpickle. Pass in metadata + scoped_session 
query2 = loads(serialized, metadata, Session) 

print query2.all() 
+1

Dies scheint nur auf die Abfrage selbst anwenden, nicht auf die darin enthaltenen Daten. Ich denke, das OP fragt nach der Codierung der Ergebnisse eines Abfrageobjekts als json. –

1

Dieser Blog-Eintrag hat die Lösung zur Verfügung gestellt ich ging: http://blogs.gnome.org/danni/2013/03/07/generating-json-from-sqlalchemy-objects/

Die Strategie wurde ein .todict Verfahren direkt mit einer Basis mixin aufzunehmen welche über die Spalten der Elternklasse iteriert.

Alternativ Nande Ansatz (https://stackoverflow.com/a/19602809/837575) zu verwenden sqlalchemy.ext.serializer funktioniert gut, wenn Sie versuchen, Daten über die Leitung serialisieren, aber nicht unbedingt als json benötigen.

+0

Verknüpfter Blog-Artikel hat keine Code-Formatierung. Nur schwarz/weiße Blobs von Text. –

0

Ich füge diese anwser hinzu, da es eine Mischung aus @mekarpeles und @ hd1 ist. Ich meine ich nicht die sqlalchemy Hierarchie von Objekten geändert haben, nur zum Delegieren von einem einfachen JSONEncoder:

# given that you have 
Base = declarative_base() 

class SqlAlchemyModelEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, Base): 
      result = OrderedDict() 
      for key in obj.__mapper__.c.keys(): 
       result[key] = getattr(obj, key) 
      return result 
     return json.JSONEncoder.default(self, obj) 

Wenn Ihre Modelle nicht serialisierbar Klassen verwenden (Datumzeit zum Beispiel) Sie sie dem Encoder hinzufügen:

if isinstance(obj, datetime): 
    return obj.isoformat() 

Und dann benutze ich es mit einem jinja2 Kontextfilter:

@contextfilter 
def tojson(ctx, model, *elements, **kw): 
    return json.dumps(model, cls=SqlAlchemyModelEncoder) 
0

https://github.com/TaylorHere/PythonSerializer
der obige Link kann Ihnen eine Hand geben, es ist ein kleines Skript, das einfach SQL-Abfrage-Ergebnis zur Liste oder dict serialisiert werden kann, so wie dies:

#Useage with flask and SQLalchemy 
from serializer import serializer 
def my_location(): 
    if request.method == 'GET': 
     user = db_session.query(User).filter(
     User.openid == session['user_id']).first() 
     addresses = user.addresses 
     return jsonify({'data': serializer(addresses.instance, 'sqlalchemy')}) 
Verwandte Themen