2014-05-12 10 views
5

Zasadniczo, chcę tylko, aby json kodować wyniki mojego zapytania sql.Python Sql Alchemy - Jak jsonify wynik klasy obiekt z kwerendy bazy danych

x = db.session.query(User).filter_by(username = request.form['username'], password = request.form['password']).first() 
    print vars(x) 
return jsonify(x) 

raise TypeError(repr(o) + " is not JSON serializable") 

TypeError: < User WashingtonGeorge> is not JSON serializable 

Oto wynik dla druku vars (x)

{'_updated': None, 'username': u'WashingtonGeorge', 'password': u'Washington', '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7fd12a50c8d0>, 'firstname': u'George', 'lastname': u'Washington', '_created': None, 'fullname': u'George Washington', '_id': 1, 'email': u'[email protected]'} 
+0

Trzeba szeregować wyniki. spójrz na tę odpowiedź http://stackoverflow.com/questions/7102754/jsonify-a-sqlalchemy-result-set-in-flask?rq=1 – codegeek

+0

http://marshmallow-sqlalchemy.readthedocs.io/en/latest/ –

Odpowiedz

0

Zakładam zmienną '_updated' & '_created' w twojej class User są typu DateTime. Datetime nie jest dostępny w jsonify. Możesz po prostu skonwertować zmienną datetime na str. np. str (some_date_in_datetimeformat) może działać.
Również, '_sa_instance_state', który jest typu sqlalchemy.orm.state.InstanceState powinien być możliwy do serializacji.

Aktualizacja:

jsonify nie jest w stanie do serializacji swój obiekt. Najlepszym rozwiązaniem jest zdefiniowanie funkcji serialize() w klasie i użycie jej do umożliwienia serializacji danych. Więc twoja klasa stanie się, wtedy, w miejscu, w którym chcesz przenieść dane, po prostu zadzwoń.

jsonify(x.serialize()) 
+0

Próbowałem usunąć atrybuty zawierające pola datetime, a sugerowana metoda nie działała. results = db.session.query (Użytkownik) .filter_by (username = request.form ['username'], password = request.form ['password']). first() del results._created del results._updated drukuj vars (wyniki) powrót jsonify (wyniki = wyniki) – olleh

+0

Zaktualizowałem moją odpowiedź. Jest to częsty problem z jsonify i został już wcześniej odpowiedzi na stackoverflow (Zobacz komentarz codegeek na swoje pytanie.) –

3

Możesz użyć marshallow. Oto przykład. zdefiniować serializer.py i umieścić go obok pliku main.py oraz:

w serializer.py

from marshmallow import Serializer 

###### USER SERIALIZER ##### 
class UserSerializer(Serializer): 
    class Meta: 
     # Fields to expose 
     fields = ('username') 
     # you can add any other member of class user in fields 

#Return the user data in json format 
def get_user_serialized(user): 
    return UserSerializer(user).data 

w main.py

from .serializers import get_user_serialized 
... 
... 
... 

x = db.session.query(User).filter_by(username = request.form['username'], password = request.form['password']).first() 

serialized = [get_user_serialized(item) for item in x] 
res = jsonify(res=serialized) 
return res 
+3

Oto sens, który jest na bieżąco z prawoślazu 1.0: https://gist.github.com/sloria/aecc540db3a95fbbee2f –

Powiązane problemy