gpt4 book ai didi

python - 如何编写依赖于子关系列的混合属性?

转载 作者:太空狗 更新时间:2023-10-30 01:21:12 24 4
gpt4 key购买 nike

假设我有两个表(使用 SQLAlchemy)用于 parent 和 child :

class Child(Base):
__tablename__ = 'Child'
id = Column(Integer, primary_key=True)
is_boy = Column(Boolean, default=False)
parent_id = Column(Integer, ForeignKey('Parent.id'))


class Parent(Base):
__tablename__ = 'Parent'
id = Column(Integer, primary_key=True)
children = relationship("Child", backref="parent")

如何查询属性以了解 parent 是否有任何 child 是男孩?希望在 pandas 中使用此列,但不确定如何有效地查询它。我的直觉是创建一个 SQLALchemy 混合属性 has_a_boy_child,但我不确定如何定义混合属性或匹配表达式。谢谢!

最佳答案

正在关注 Correlated Subquery Relationship Hybrid例如,我将构建一个返回 count 男童的属性:

@hybrid_property
def has_a_boy_child(self):
return any(child.is_boy for child in self.children)

@has_a_boy_child.expression
def has_a_boy_child(cls):
return (
select([func.count(Child.id)])
.where(Child.parent_id == cls.id)
.where(Child.is_boy == True)
.label("number_of_boy_children")
)

你可以像这样使用它:

q_has_boys = session.query(Parent).filter(Parent.has_a_boy_child).all()
q_no_boys = session.query(Parent).filter(~Parent.has_a_boy_child).all()
q_attr = session.query(Parent, Parent.has_a_boy_child).all()

更新:如果您真的想要一个bool 而不是count(其中None 将是na 在 pandas 中),你可以如下所示进行:

@has_a_boy_child.expression
def has_a_boy_child(cls):
return (
select([
case([(exists().where(and_(
Child.parent_id == cls.id,
Child.is_boy == True,
)).correlate(cls), True)],
else_=False,
).label("has_boys")
])
.label("number_of_boy_children")
)

关于python - 如何编写依赖于子关系列的混合属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33267860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com