0

在 sqlalchemy 声明性基础中,我想从选择中定义一个类。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

aliased是 ORM 的一部分,但select不是 - 它是生成 SQL 的工具,但不会将对象映射到行。ORM 的一些构造不能与select其他核心构造一起使用。

_H1 = C1.__table__.alias()您可以改为尝试(aliased是 ORM 的等价物alias

于 2012-06-09T13:15:57.610 回答