我有一个类似下面的架构:
CREATE TABLE user (id integer, name text);
CREATE TABLE link (id1 integer, id2 integer, type integer);
CREATE TABLE address (id integer, address text);
link
表是一个通用连接表:我们使用type
列来限制两个实体之间的连接(例如,type = 1001表示用户与地址的关系)。
我想使用SQLAlchemy表达以下查询:
SELECT *
FROM user
JOIN link ON
link.id1 = user.id
AND link.type = 1001
JOIN address ON
address.id = link.id2
就是这样,在关系的辅助连接参数中声明了额外的过滤器(即link.type = 1001
)。
我有以下SQLAlchemy定义:
link = Table('link', db.metadata,
Column('id1', INTEGER(), ForeignKey('core_user.user_id')),
Column('id2', INTEGER(), ForeignKey('core_comm.id')),
Column('type', INTEGER())
)
class User(db.Model):
__tablename__ = 'user'
__schema__ = 'public'
id = Column('id', INTEGER(), primary_key=True)
name = Column('name', TEXT())
addresses = relationship('Address', secondary=link)
class Address(db.Model):
__tablename__ = 'address'
__schema__ = 'public'
id = Column(INTEGER(), primary_key=True)
address = Column(Text())
它在3个表之间正确连接,我得到了记录,但我找不到在辅助连接上应用其他过滤器的方法。我甚至不确定它是否正确。
理想情况下,我想在User对象中获得一个addresses
字段,该字段可能是一个Address对象列表,可能会被反向引用。
任何提示? 谢谢!
答案 0 :(得分:0)
阅读文档的Specifying Alternate Join Conditions
部分。下面的代码应该这样做:
addresses = relationship('Address',
secondary=link,
primaryjoin=id==link.c.id1,
secondaryjoin="and_(link.c.id2 == Address.id, link.c.type == 1001)",
backref="users",
)