2012-06-07 60 views
0

在sqlalchemy聲明基礎中,我想要從select中定義一個類。也許我很困惑sqlalchemy.select()session.query()之間的區別是什麼...如果有人能解釋我這就像我3歲(與Python知識)。python sqlalchemy選擇別名

我沒有麻煩簡單連接,

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是ORM的一部分,但select不是 - 這是一個工具來生成SQL,但不對象行映射。 ORM的幾個構造不能與select和其他核心構造一起使用。

您可以嘗試_H1 = C1.__table__.alias()代替(aliased是ORM相當於alias的)