0
我有以下的模型(简体):创建与内部查询有问题加入与外连接
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
class Thing(Base):
__tablename__ = 'thing'
id = Column(Integer, primary_key=True)
class Relationship(Base):
__tablename__ = 'relationship'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('thing.id'))
parent = relationship('Thing', backref='parentrelationships', primaryjoin = "Relationship.parent_id == Thing.id")
child_id = Column(Integer, ForeignKey('thing.id'))
child = relationship('Thing', backref='childrelationships', primaryjoin = "Relationship.child_id == Thing.id")
class Vote(Base)
__tablename__ = 'vote'
id = Column(Integer, primary_key=True)
rel_id = Column(Integer, ForeignKey('relationship.id'))
rel = relationship('Relationship', backref='votes')
voter_id = Column(Integer, ForeignKey('user.id'))
voter = relationship('User', backref='votes')
我想查询有一定的母公司所有的关系,我也想查询票由某个用户在这些关系上创建的。我试过什么:
def get_relationships(thisthing, thisuser):
return DBSession.query(Relationship, Vote).\
filter(Relationship.parent_id == thisthing.id).\
outerjoin(Vote, Relationship.id == Vote.rel_id).\
filter(Vote.voter_id == thisuser.id).\
filter(Vote.rel_id == Relationship.id).\
all()
还有:
def get_relationships(thisthing, thisuser):
session = DBSession()
rels = session.query(Relationship).\
filter(Relationship.parent_id == thisthing.id).\
subquery()
return session.query(rels, Vote).\
outerjoin(Vote, rels.c.id == Vote.rel_id).\
filter(Vote.voter_id == thisuser.id).\
all()
我得到空当我做这两种查询。我究竟做错了什么?
谢谢你,现在没有错误。但是,当我尝试提取信息时,Vote为null的行不会返回。根据我对左外连接的理解,无论右连接是否为空,都应返回该行。我究竟做错了什么?我使用以下方法提取对象: for a,b in get_relationships(thisthing,thisuser): #执行此操作 –
使用'LEFT OUTER JOIN',将返回连接的左侧('Relationship'),如果找不到右侧('Vote')的匹配行,但会返回“NULL/None”。你想看到什么? – van
我希望它像一个左外连接,但现在它的行为像一个内连接,即使我正在使用outerjoin()。 (关系)没有被返回时(投票)没有找到,虽然我应该除了(NULL)。 –