Sqlalchemy - 如何生成仅返回jsonb列中的字段的查询

时间:2016-09-22 23:13:36

标签: python postgresql sqlalchemy jsonb

我试图找到生成sql查询的最佳方法,该查询从我的数据库中的jsonb列获取特定字段。我想生成这样的查询:

select images->'main' from scenes where id = 1;

我找到了使用with_entities的this参考,这会正确生成查询:

>>> x = Scene.query.with_entities(Scene.images['main']).first()                                                                                                                                                                        
2016-09-22 18:57:01,825 INFO sqlalchemy.engine.base.Engine SELECT scenes.images -> %(images_1)s AS anon_1                                                                                                                              
FROM scenes                                                                                                                                                                                                                            
 LIMIT %(param_1)s                                                                                                                                                                                                                     
2016-09-22 18:57:01,826 INFO sqlalchemy.engine.base.Engine {'param_1': 1, 'images_1': 'main'}                                                                          

但是,它将结果作为元组而不是模型对象返回:

>>> x                                                                                                                                                                                                                                  
([{u'url': u'foo.jpg', u'priority': 1}],)        

我考虑过使用load_only,但是这个API似乎没有办法指定列的jsonb字段,只能指定整个列名。

有没有办法生成查询并将模型对象作为返回值?

2 个答案:

答案 0 :(得分:0)

假设Scene是ORM类,您可以使用Session.query()将值作为元组返回

x = session.query(Scene.images['main']).filter_by(id=1).one()
print x
SELECT images->'main' FROM scenes WHERE id = 1;

或模型对象(Scene的实例)

scene = session.query(Scene).filter_by(id=1).one()
print scene.images['main']
SELECT * FROM scenes WHERE id = 1;

答案 1 :(得分:0)

x = db.session.query(Scene.images['main'].label('main_image')).first()
print(x.main_image)