0

sqlalchemy 宣言ベースで、select からクラスを定義したいと考えています。多分私は混乱しています と の違いは何ですかsqlalchemy.select()...session.query()誰かが私が3歳のように私にこれを説明できれば(Pythonの知識があります)。

次のような単純な結合に問題はありません

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.

4

1 に答える 1

1

aliasedORM の一部ですが、selectそうではありません。SQL を生成するツールですが、オブジェクトを行にマップしません。selectORM の構造のいくつかは、およびその他のコア構造では機能しません。

_H1 = C1.__table__.alias()代わりに試すことができます(aliasedは に相当する ORM ですalias)

于 2012-06-09T13:15:57.610 に答える