当前位置: 首页 > 面试题库 >

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

周锐
2023-03-14
问题内容

是否可以控制在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)>
...

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


问题答案:

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

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())



 类似资料:
  • 问题内容: 我有一个查询,看起来像这样: 这是一个非常基本的查询。除了提取Item的值之外,我还想将其他值添加到混合中,然后将其返回给我。在原始SQL中,我会这样做: 如何通过sqlalchemy手动添加该值? 问题答案: 您需要使用,看起来有点像这样: 注意,该参数无需任何转换即可插入查询;如果您从应用程序外部接受text参数的值,则可能使您暴露于SQL Injection漏洞。如果这是您需要的

  • 问题内容: 这是我的(PostgreSQL)表- 我想选择所有 不 知道要结婚的人,即包括那些拥有NULL wedding_status的人。 这并 不能 正常工作- 当然可以- 问题是我正在使用-从SQLAlchemy访问它 转换为- 而且也 没有 工作- 也不- 如何通过SQLAlchemy选择NULL值? 问题答案: (由指示@augurar)):因为 SQLAlchemy的 使用 魔术方法

  • 问题内容: 我有一个延伸的对象。默认情况下,两个对象都在我的Derby数据库的表中(来自的包含字段)。通常我会选择一个这样的: 但是由于查询的复杂性,我使用的是本机查询,如下所示: 尽管这会引发强制转换异常。我认为这是由于中的任何字段造成的。 我的问题是,我如何选择一个使用本机查询的结果与第一个示例相同的结果(包括与JPQL查询将返回的和(等)相同的值)? 问题答案: 您可能想尝试以下方法之一:

  • 问题内容: 我有桌子: 我想写一个返回BookName,FirstName,LastName,RubricName的SELECT查询。 我有两个单独的查询,但我不知道如何在一个选择中编写此查询。这就是我得到的: 它工作正常,但如何在一个选择中编写? 我尝试这样做,但是不起作用: 它返回错误: 问题答案: 试试这个查询

  • 公共类CountryMasterModel{私有字符串CountryName[]; } 公共接口服务{ } @组件公共类CountryMasterDAO实现CountryMasterService{ } 在此输入图像描述

  • 用于选择对象的选项 在可以修改某个对象之前,需要将其与周围的对象区分开来。只需选择对象,即可加以区分。只要选择了对象或者对象的一部分,即可对其进行编辑。 Illustrator 提供以下选择方法和工具: 隔离模式可让您快速将一个图层、子图层、路径或一组对象与文档中的其他所有图稿隔离开来。在隔离模式下,文档中所有未隔离的对象都会变暗,并且不可对其进行选择或编辑。 图层面板可让您快速而准确地选择单个或