Python 如何在SQLAlchemy中执行自定义联接

Python 如何在SQLAlchemy中执行自定义联接,python,sqlalchemy,Python,Sqlalchemy,我使用的数据库没有在表之间创建关系,更改模式对我来说不是一个选项 我试图在orm中描述如何在不描述Foregin键的情况下连接两个表。为了让事情变得更糟,我需要在SQL中使用一个自定义的ON子句 这是我的ORM(或多或少): 目标 我试图创建的是关系,它连接如下表: ..... FROM Table1 JOIN Table2 ON (Table1.id1 = Table2.id1 OR Table1.id2 = Table2.id2) 我的尝试 我尝试添加以下表1,但文档并没有解释我能理解的错

我使用的数据库没有在表之间创建关系,更改模式对我来说不是一个选项

我试图在orm中描述如何在不描述Foregin键的情况下连接两个表。为了让事情变得更糟,我需要在SQL中使用一个自定义的
ON
子句

这是我的ORM(或多或少):

目标 我试图创建的是
关系
,它连接如下表:

.....
FROM Table1
JOIN Table2 ON (Table1.id1 = Table2.id1 OR Table1.id2 = Table2.id2)
我的尝试 我尝试添加以下
表1
,但文档并没有解释我能理解的错误:

table2 = relationship("Table2", 
                      primaryjoin=or_(foreign(id1) == remote(Table2.id1),
                                      foreign(id2) == remote(Table2.id2)))
但在测试时,我返回了错误的SQL查询(我希望在SQL中看到我上面描述的连接):

选择“table1.id1”、“table1.id2”、“table2.id1”、“table2.id2” 从“表1”、“表2”

注 我并不真正了解
remote
foregin
的功能,但我试图从文档中推断它们属于何处,否则我将在导入时出错,并说:

ArgumentError:在关系表1.other_表上找不到主联接条件“my full primaryjoin code”的任何相关外键列。确保引用列与ForeignKey或ForeignKeyConstraint关联,或者在连接条件中使用foreign()注释进行注释

我不认为我可以使用ForeignKey或ForeignKeyContrain,因为我的列都没有与其他表的值相关联。

表达式

str(query(Table1,Table2))
正如您所观察到的,在两个表之间生成交叉联接。这是预期的行为。如果要使用内部联接等,则必须明确说明:

str(query(Table1, Table2).join(Table1.table2))
表2
。该属性指示此联接应如何发生


根据我自己的喜好,关于和的文档也有点分散,但它是在和中建立的,当外来注释和远程注释位于表达式的不同侧面时(在on子句中),这种关系被认为是多对一的。当它们位于同一侧或忽略远程时,被认为是一对多。所以你们的关系被认为是多对一


它们只是和参数的一种替代方法。

有些关联:如果我错了,请纠正我,
关系
不会在
查询
中为我创建联接。它只描述了在我明确表示要联接表时如何联接表?该属性作为相关对象(一对多、多对多)的集合工作/引用实例(将关系模型映射到对象模型)上的相关对象(多对一)。:)谢谢您,先生,您今天为我节省了数小时的研究时间。
str(query(Table1,Table2))
str(query(Table1, Table2).join(Table1.table2))