- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有以下模型:
class Department(Base):
__tablename__ = 'departments'
id = Column(Integer, primary_key=True)
class Employee(Base):
__tablename__ = 'employees'
id = Column(Integer, primary_key=True)
department_id = Column(None, ForeignKey(Department.id), nullable=False)
department = relationship(Department, backref=backref('employees'))
有时,当我查询部门时,我还想获取他们拥有的员 worker 数。我可以使用 column_property
实现这一点,如下所示:
Department.employee_count = column_property(
select([func.count(Employee.id)])
.where(Employee.department_id == Department.id)
.correlate_except(Employee)
)
Department.query.get(1).employee_count # Works
但是计数总是通过子查询获取,即使我不需要它。显然我也不能要求 SQLAlchemy 在查询时不加载它:
Department.query.options(noload(Department.employee_count)).all()
# Exception: can't locate strategy for <class 'sqlalchemy.orm.properties.ColumnProperty'> (('lazy', 'noload'),)
我还尝试使用混合属性而不是列属性来实现它:
class Department(Base):
#...
@hybrid_property
def employee_count(self):
return len(self.employees)
@employee_count.expression
def employee_count(cls):
return (
select([func.count(Employee.id)])
.where(Employee.department_id == cls.id)
.correlate_except(Employee)
)
没有运气:
Department.query.options(joinedload('employee_count')).all()
# AttributeError: 'Select' object has no attribute 'property'
我知道我可以将计数作为一个单独的实体来查询,但我经常需要它,所以我真的更喜欢将它作为模型的一个属性来方便使用。这在 SQLAlchemy 中甚至可能吗?
编辑:澄清一下,我想避免 N+1 问题,并在与部门相同的查询中加载员工计数,而不是在每个部门的单独查询中加载。
最佳答案
您尝试的加载策略是针对关系的。 column_property
的加载以与普通列相同的方式改变,参见 Deferred Column Loading .
通过将 deferred=True
传递给 column_property
,您可以默认延迟加载 employee_count
。延迟列时,访问属性时会发出 select 语句。
sqlalchemy.orm
中的
defer
和 undefer
允许在构造查询时更改它:
from sqlalchemy.orm import undefer
Department.query.options(undefer('employee_count')).all()
关于python - 在 SQLAlchemy 中延迟加载 column_property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39480514/
我有两个 column_property 列,我想在 grandtotal 列中将它们加在一起。我希望能够根据 grandtotal 列进行排序和过滤。 如何对 subtotal 和 shipping
这是模型 class Trade(Base): __tablename__ = 'trade' *** original_price = Column(FLOAT) l
我有两个模型: class Report(Base): __tablename__ = 'report' id = Column(Integer, primary_key=True)
我有这个 sql 查询: select rooms.*, COUNT(DISTINCT(o.resident_id)) as resident_count, COUNT(rev
我试图在使用 column_property 分配列时将列转换为 float : class voteinfo(Base): __tablename__ = 'voteinfo' id
我有一些 SA 模型,需要一些技巧: class Entry(Base): __tablename__ = 'entry' id = Column(Integer, primary_k
假设我有以下模型: class Department(Base): __tablename__ = 'departments' id = Column(Integer, primary
所以我有一个模型 Event,我想创建一个名为 start_time_local 的 column_property,它应该是 datetime 在存储在 timezone_name 列中的时区中,当
我知道我可以延迟加载表中的列: session.query(MyTable).options(defer(colname) for colname in ['col4', 'col5',
我在 sqlalchemy-0.7 中有一个带有日期列的类。我可以要一个 column_property 吗?或任何类似的东西让我很容易通过它过滤?怎么写呢? IE,我想要(声明性语法): class
我想要在我的 sqlalchemy 模型中有一列 total,该列等于 amount *price。列值可以通过 object.total 访问,但列名称不会显示在 model.__table__.c
我是一名优秀的程序员,十分优秀!