为什么 sqlalchemy 结果字典忽略 text() 列?
Why sqlalchemy result dict ignores text() columns?
我正在尝试新的 sqlalchemy 1.4 select() 语法,但是在执行这个简单查询时,结果字典缺少列 'graph',但结果列表包含它。
import sqlalchemy as sa
from source.Models import Quadrant, Graph
engine = sa.create_engine("postgresql://blahblahblah")
dbsession = sa.orm.Session(engine)
stmt = sa.select(
Quadrant.id,
sa.text("jsonb_agg(graph.data order by graph.id) as graphs")
).outerjoin(
Graph, Quadrant.id == Graph.quadrant_id
).group_by(
Quadrant.id
)
with dbsession.begin():
res = dbsession.execute(stmt)
for r in res:
print(r.keys()) # -> ['id'] **no graphs here!**
print(list(r)) # -> [0, {aggregated data}]
print(r[1]) # -> {aggregated data}
有没有办法让dict包含文本列的结果?
我对在 python 中聚合结果不感兴趣:我想在 postgresql 中聚合。
使用literal_column
代替text
,如果你想使用文本片段:
sa.literal_column("jsonb_agg(graph.data order by graph.id)").label("graph")
您还可以使用 SQLA 构造生成表达式:
from sqlalchemy.dialects.postgresql import aggregate_order_by
sa.func.jsonb_agg(aggregate_order_by(Graph.data, Graph.id)).label('graph')
我正在尝试新的 sqlalchemy 1.4 select() 语法,但是在执行这个简单查询时,结果字典缺少列 'graph',但结果列表包含它。
import sqlalchemy as sa
from source.Models import Quadrant, Graph
engine = sa.create_engine("postgresql://blahblahblah")
dbsession = sa.orm.Session(engine)
stmt = sa.select(
Quadrant.id,
sa.text("jsonb_agg(graph.data order by graph.id) as graphs")
).outerjoin(
Graph, Quadrant.id == Graph.quadrant_id
).group_by(
Quadrant.id
)
with dbsession.begin():
res = dbsession.execute(stmt)
for r in res:
print(r.keys()) # -> ['id'] **no graphs here!**
print(list(r)) # -> [0, {aggregated data}]
print(r[1]) # -> {aggregated data}
有没有办法让dict包含文本列的结果?
我对在 python 中聚合结果不感兴趣:我想在 postgresql 中聚合。
使用literal_column
代替text
,如果你想使用文本片段:
sa.literal_column("jsonb_agg(graph.data order by graph.id)").label("graph")
您还可以使用 SQLA 构造生成表达式:
from sqlalchemy.dialects.postgresql import aggregate_order_by
sa.func.jsonb_agg(aggregate_order_by(Graph.data, Graph.id)).label('graph')