2016-05-03 6 views
2

Ich würde gerne herausfinden, wie Postgres (9.2) row_to_json mit SqlAlchemy verwenden. Ich habe jedoch keine funktionierende Syntax gefunden.Syntax für row_to_json mit sqlalchemy

details_foo_row_q = select([Foo.*] 
    ).where(Foo.bar_id == Bar.id 
).alias('details_foo_row_q') 

details_foo_q = select([ 
    func.row_to_json(details_foo_row_q).label('details') 
]).where(details_foo_row_q.c.bar_id == Bar.id 
).alias('details_foo_q') 

Ich möchte im Idealfall nicht jedes Feld aus dem Tabellenmodell tippen, wenn möglich.

bekam die Antwort von 'mn':

details_foo_row_q = select([Foo]).where(Foo.bar_id == Bar.id).alias('details_foo_row_q') 

details_foo_q = select([ 
    func.row_to_json(literal_column(details_foo_row_q.name)).label('details') 
]).select_from(details_foo_row_q).where(
    details_foo_row_q.c.bar_id == Bar.id 
).alias('details_foo_q') 

Danke mn, funktioniert super:

Es ist etwas mehr so ​​sein sollte!

Antwort

2

Ihre Abfrage generiert einen falschen SQL

SELECT row_to_json(SELECT ... FROM foo) AS details 
FROM (SELECT ... FROM foo) AS details_foo_row_q 

Es sollte

sein
SELECT row_to_json(details_foo_row_q) AS details 
FROM (SELECT ... FROM foo) AS details_foo_row_q 

Sie müssen als literal_column wählen verwenden

from sqlalchemy.sql.expression import literal_column 

details_foo_q = select([ 
    func.row_to_json(literal_column(details_foo_row_q.name)).label('details') 
]).select_from(details_foo_row_q).where(
    details_foo_row_q.c.bar_id == Bar.id 
).alias('details_foo_q') 
+0

es funktioniert! Ich denke aufgrund der Variable 'name' und der Literal_column – slashdottir