如何在SQLAlchemy中对主表进行两次连接?

3 投票
1 回答
756 浏览
提问于 2025-04-16 16:23

情况是这样的:我有两个表,一个叫“master”,另一个叫“detail”。在“master”表中,有两列是指向“detail”表的,分别是“foo_id”和“bar_id”。也就是说,我需要把“detail”表连接两次,但要用不同的名字。我的想法是:

SELECT master.id, foo.name, bar.name, other stuff ...
FROM master
JOIN detail AS foo ON foo.id = master.foo_id
JOIN detail AS bar ON bar.id = master.bar_id

我该怎么用SQLAlchemy来实现这个呢?

需要注意的是,我并没有使用ORM(对象关系映射)。而且我是在用元数据(字符串)来引用数据库对象,所以我会用table.c["foo_id"]而不是table.c.foo_id(如果这对构建语句有帮助的话)。

1 个回答

2

我花了很长时间在这个问题上,结果在这里发问后几分钟就解决了。解决办法是先存储所有的别名表,然后再重复使用它们。之前我在连接表的时候用了别名,然后在SELECT中又用同样的别名来获取列的引用,这样就导致了冗余和错误的写法,比如 'FROM detail AS foo, detail AS bar, master JOIN detail ... JOIN detail ...'。

有效的解决方案是:

先创建一个空的字典,用来存储别名表,格式是:{ "表名": 表对象 }

对于每一个主从连接,使用别名在字典中注册新表:

detail_table = Table(name,...).alias(alias) tables[alias] = detail_table

接下来连接下一个别名表:

expression = join(expression, detail_table)

在收集SELECT字段的时候,不要再获取另一个表(比如 Table(name, ...)),而是从你存储的别名表列表中获取:

column = tables[table_name].c[column_name]

撰写回答