如何在SQLAlchemy中对主表进行两次连接?
情况是这样的:我有两个表,一个叫“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]