【发布时间】:2018-10-17 18:56:54
【问题描述】:
我正在使用的数据库没有在表之间创建关系,并且更改架构不是我的选择。
我试图在 orm 中描述如何在不描述 Foregin 键的情况下连接两个表。为了让事情变得更糟,我需要在我的 SQL 中自定义 ON 子句
这是我的 ORM(或多或少):
class Table1(Base):
__tablename__ = "table1"
id1 = Column(String)
id2 = Column(String)
class Table2(Base):
__tablename__ = "table2"
id1 = Column(String)
id2 = Column(String)
目标
我要创建的是relationship,它可以像这样连接表:
.....
FROM Table1
JOIN Table2 ON (Table1.id1 = Table2.id1 OR Table1.id2 = Table2.id2)
我的尝试
我尝试添加以下Table1,但文档没有用我能理解的术语解释这是怎么回事:
table2 = relationship("Table2",
primaryjoin=or_(foreign(id1) == remote(Table2.id1),
foreign(id2) == remote(Table2.id2)))
但是在测试时我得到了错误的 SQL 查询(我希望在 SQL 中看到我上面描述的连接):
str(query(Table1,Table2))
选择“table1”.id1、“table1”.id2、“table2”.id1、“table2”.id2 FROM "table1","table2"
注意
我并不真正了解 remote 和 foregin 做了什么,但我试图从文档中推断它们属于哪里,否则我会在导入时出错:
ArgumentError:在关系 Table1.other_table 上找不到任何与主连接条件'my full primaryjoin code'相关的外键列。确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或者在连接条件中使用 foreign() 注释进行注释。
我认为我不能使用 ForeignKey 或 ForeignKeyContraint,因为我的所有列都不受其他表的值的限制。
【问题讨论】:
标签: python sqlalchemy