在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。
答案 0 :(得分:1)
aliased
是ORM的一部分,但select
不是 - 它是生成SQL的工具,但不会将对象映射到行。 ORM的一些构造不适用于select
和其他核心构造。
您可以尝试使用_H1 = C1.__table__.alias()
(aliased
是ORM等效于alias
)