SQLAlchemy:在查询中选择对象的哪些列

发布于 2021-01-29 17:54:34

是否可以控制在SQLAlchemy的查询方法中查询哪些列,同时仍返回您正在查询的对象的实例(尽管已部分填充)?

还是SQLAlchemy有必要执行SELECT *映射到对象?

(我确实知道可以查询单个列,但不会将结果映射到对象,而仅映射到命名元组的组件)。

例如,如果User对象具有属性userid,name,password和bio,但是您希望查询仅为其返回的对象填写userid和name:

# hypothetical syntax, of course:
for u in session.query(User.columns[userid, name]).all():
    print u

将打印:

<User(1, 'bob', None, None)> 
<User(2, 'joe', None, None)>
...

这可能吗; 如果是这样,怎么办?

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以查询单个列,这些列返回命名元组,实际上,如果您只是传递给模板或其他对象,它们的行为实际上与映射对象非常相似:

    http://www.sqlalchemy.org/docs/orm/tutorial.html#querying

    或者您可以通过配置或使用选项在映射的类上将各种列设置为“ deferred”:

    http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred-
    column-
    loading

    在Trac中有一张旧票叫“ defer_everything_but()”,如果有人想提供测试,并且没有理由不能添加功能,这里有一个快速版本:

    from sqlalchemy.orm import class_mapper, defer
    def defer_everything_but(entity, cols):
        m = class_mapper(entity)
        return [defer(k) for k in 
                set(p.key for p 
                    in m.iterate_properties 
                    if hasattr(p, 'columns')).difference(cols)]
    
    s = Session()
    print s.query(A).options(*defer_everything_but(A, ["q", "p"]))
    

    defer()应该真正接受倍数,为此添加了票证#2250(编辑:如注释中所述,它在0.9中为load_only()



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看