SQLAlchemy以多对多关系为连接表添加别名

时间:2018-02-20 16:08:01

标签: python sqlalchemy

在我们拥有的遗留数据库中,有一个非常特殊的数据结构,我们有两个多对多关系,将相同的两个表 公司连接到 paymentschedules

使用名为 companies_paymentschedules 的关联表存在多对多关系,使用名为 companies_comp_paymentschedules 的关联表存在第二个多对多关系。 两种关系都有不同的目的。

companies_paymentschedules存储公司有折扣的付款计划,companies_comp_paymentschedules存储链接到公司的付款计划

(我知道这可以通过用一个查找表替换这些表来简化,但这不是这个遗留数据库中的一个选项。)

问题是我需要在同一个查询中加入两种类型的公司(折扣和链接)。 SQLAlchemy加入这两个表没有问题,但它也加入了公司表,并将它们称为“公司”,这导致SQL语法错误(使用MSSQL BTW)。

这是查询:

q = Paymentschedules.query
# join companies if a company is specified
if company is not None:
    q = q.join(Paymentschedules.companies)
    q = q.join(Paymentschedules.companies_with_reduction)

多对多关系都在我们的公司模型中定义,如下所示:

paymentschedules_with_reduction = relationship("Paymentschedules", secondary=companies_paymentschedules, backref="companies_with_reduction")

paymentschedules = relationship("Paymentschedules", secondary=companies_comp_paymentschedules, backref="companies")

问题是JOINS触发SQLAlchemy创建一个如下所示的SQL语句:

FROM paymentschedules
JOIN companies_comp_paymentschedules AS companies_comp_paymentschedules_1 ON paymentschedules.pmsd_id = companies_comp_paymentschedules_1.pmsd_id
JOIN companies ON companies.comp_id = companies_comp_paymentschedules_1.comp_id
JOIN companies_paymentschedules AS companies_paymentschedules_1 ON paymentschedules.pmsd_id = companies_paymentschedules_1.pmsd_id
JOIN companies ON companies.comp_id = companies_paymentschedules_1.comp_id

两个查找表具有不同的名称,但两种情况下相关公司表都称为“公司”,导致SQL错误:

[SQL Server Native Client 11.0][SQL Server]The objects "companies" and "companies" in the FROM clause have the same exposed names. Use correlation names to distinguish them. (1013) (SQLExecDirectW); ...]

我一直在寻找一种方法来为一个连接添加别名,或者可能将我的查找表中的一个关系别名为公司表,但我无法这样做。

有没有办法为连接的多对多表别名?

更新

根据@IljaEverilä的建议,我发现:http://docs.sqlalchemy.org/en/latest/orm/query.html?highlight=onclause(参见“加入具有ON子句的目标”)作为别名连接表的方法,但是示例仅显示如何为一对多类型连接添加别名。在我的情况下,我需要别名查找表的另一面,所以我不能将示例代码应用于我的情况。

0 个答案:

没有答案