SQLAlchemy混合表达式concat问题

时间:2015-11-26 13:52:24

标签: python mysql properties sqlalchemy hybrid

以下是我试图解决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。

1 个答案:

答案 0 :(得分:0)

似乎"选择"表达本身是不够的"其中"条款是必需的。 "标签"将返回标量可选(子查询)以及特定sql表达式的附加标记。

这是一种可能的解决方案:

@ChildResourceId.expression
def ChildResourceId(cls):
    return select([Parent.Name + '-' + cls.Name]).\
        where(Parent.Id == cls.ParentId).label('resource_id')