以下是我试图解决2天的问题,但没有成功:
class Parent(Base):
__tablename__ = 'Parent'
__table_args__ = {'schema': 'Schema', 'extend_existing': True}
Id = Column(Integer, primary_key=True)
Name = Column(String(255))
class Child(Base):
__tablename__ = 'Child'
__table_args__ = (UniqueConstraint('ParentId', 'Name'),
{'schema': 'Schema', 'extend_existing': True})
Id = Column(Integer, primary_key=True)
ParentId = Column(Integer, ForeignKey('Schema.Parent.Id'))
Name = Column(String(255))
parent = relationship('Parent', uselist=False, viewonly=True,
backref='children')
@hybrid_property
def ChildResourceId(self):
return self.parent.Name + '-' + self.Name
@ChildResourceId.expression
def ChildResourceId(cls):
# This is the main issue:
# Which is the proper expression
# for this hybrid property
child = session.query(Child).filter_by(ChildResourceId='parent_name1-child_name1').one()
# Returns child with Id: 1
child = session.query(Child).filter_by(ChildResourceId='parent_name2-child_name1').one()
# Also returns child with Id: 1
这里的想法是使用parent.Name和child.Name的组合作为搜索条件。 我希望使用混合功能,而不是显式连接查询或其他选择。
我使用concat函数或简单的cls表达式尝试了多个表达式,如:
return cls.parent.Name + '-' + cls.Name
但是这些在我的情况下不起作用,因为正如您在代码片段中看到的那样 - 查询仅通过child.Name执行查找并忽略parent.Name。
答案 0 :(得分:0)
似乎"选择"表达本身是不够的"其中"条款是必需的。 "标签"将返回标量可选(子查询)以及特定sql表达式的附加标记。
这是一种可能的解决方案:
@ChildResourceId.expression
def ChildResourceId(cls):
return select([Parent.Name + '-' + cls.Name]).\
where(Parent.Id == cls.ParentId).label('resource_id')