2015-11-26 2 views
1

Вот следующий вопрос, который я пытаюсь решить в течение 2-х дней, но без успеха:SQLAlchemy гибридной выражение CONCAT вопрос

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 и ребенок .Именовать критерии поиска. И я хочу сделать это с помощью гибридной функции вместо явного запроса соединения или дополнительных выборок.

Я попробовал несколько выражений с помощью функции Concat или простое выражение ЦБС как:

return cls.parent.Name + '-' + cls.Name 

Но те, не работает в моем случае, потому что, как вы можете видеть в фрагменте кода - запросы выполнять только поиск по child.Name и игнорирует parent.Name.

+0

Попробуйте использовать подзапрос с выбором() в методе выражения. Взгляните на обновление здесь: http://stackoverflow.com/questions/19780178/sqlalchemy-hybrid-expression-with-relationship –

ответ

0

Похоже, что выражения «select» недостаточно, и требуется условие «где». «label» вернет скалярный selectable (подзапрос) с добавлением тегов для конкретного выражения sql.

Это один из возможных решений:

@ChildResourceId.expression 
def ChildResourceId(cls): 
    return select([Parent.Name + '-' + cls.Name]).\ 
     where(Parent.Id == cls.ParentId).label('resource_id') 
Смежные вопросы