Вот следующий вопрос, который я пытаюсь решить в течение 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.
Попробуйте использовать подзапрос с выбором() в методе выражения. Взгляните на обновление здесь: http://stackoverflow.com/questions/19780178/sqlalchemy-hybrid-expression-with-relationship –