2012-06-07 5 views
0

В декларативной базе sqlalchemy я хотел бы иметь класс, определенный из select. Может быть, я в замешательстве, в чем разница между sqlalchemy.select() и session.query() ... Если бы кто-нибудь мог объяснить мне это, как будто я 3 года (с знанием Python).python sqlalchemy select aliased

У меня нет никаких проблем с простой присоединяется, как

class ViewA(Base): 
    __select__ = (
      sqlalchemy.select([C1.attr1, C2.attr2, ...], 
       from_obj=C1.__table__.join(C2.__table__) 
       ) 
      .where(...) 
      ) 
    __table__ = __select__.alias('view_A') 

Я уже использую это в проекте, и она работает, как я ожидал. Теперь я пытаюсь создать еще один вид, но с себя присоединиться, так что я использовал orm.aliased(), но он не работает, так как он говорит, что я

sqlalchemy.exc.ProgrammingError: 
(ProgrammingError) (1066, "Not unique table/alias: 'history'", None)

Вот как я пытаюсь создать мой класс:

class ViewSummary(Base): 
    _H1 = orm.aliased(C1, name='c1') 
    _H2 = orm.aliased(C1, name='c2') 

    __select__ = (
      sqlalchemy.select([_H1.attr1, _H1.attr2, ...], 
       from_obj=(
        _H1.__table__ 
        .outerjoin(_H2.__table__, _H1.id == _H2.id) 
        .join(AnotherClass, _H1.id == AnotherClass.id) 
       ) 
      .where(_H2.field is None) 
      ) 
    __table__ = __select__.alias('view_summary') 

я ошибаюсь использование orm.aliased?

Спасибо за вашу помощь, D.

ответ

1

aliased является частью ОРМ, но select не является - это инструмент для создания SQL, но не отображает объекты строк. Некоторые из конструкций ORM не будут работать с select и другими конструкциями ядра.

Вы можете попробовать _H1 = C1.__table__.alias() вместо (aliased это ORM эквивалент alias)