我试图在SQLAlchemy中连接三个表,当它用于连接和过滤两个表时,第三个表只返回一个任意行(由于某种原因总是相同的一行)而我&#39 ;我对这种行为完全感到困惑。
表类:
class Users(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True, nullable=False)
class Groups(db.Model):
id = db.Column(db.Integer, unique=True)
group_number = db.Column(db.String(30),index=True, unique=True, nullable=False, primary_key=True)
class GroupMembers(db.Model):
id = db.Column(db.Integer, primary_key=True)
group_id = db.Column(db.String(64), db.ForeignKey('groups.group_number'), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
我尝试检索某个group_id被过滤的结果,以及与关系表(GroupMembers)中匹配的所有行以及与匹配ID对应的所有Users行。
我尝试了三件事:
q = db.session.query(GroupMemers, Groups, Users)
q = q.join(Groups).join(Users)
q = q.filter(GroupMembers.group_id == 5).all()
这将返回预期的元组,除了它只返回与用户一遍又一遍的同一行:
for row in q:
print(row)
(<GroupMembers 1>, <Groups 5>, <Users 3>)
(<GroupMembers 2>, <Groups 5>, <Users 3>)
(<GroupMembers 3>, <Groups 5>, <Users 3>)
(<GroupMembers 4>, <Groups 5>, <Users 3>)
(<GroupMembers 5>, <Groups 5>, <Users 3>)
这是正确的,因为在GroupMembers中有5行应该匹配,但是这些行中的每一行在外键GroupMembers.user_id中列出不同的User.id,并且它们都不匹配id 3。
我尝试的第二件事是切换表的顺序,因此用户是列表中的第一个表:
q = db.session.query(Users, Groups, GroupMembers)
q = q.join(Groups).join(GroupMemebrs)
q = q.filter(GroupMembers.group_id == 5).all()
但结果完全相同,只是按查询元组中指示的顺序。
我尝试做的第三件事是使用 filter()将GroupMembers.user_id与Users.id匹配,但这会返回0个匹配的行,即使应该有5个。
q = db.session.query(GroupMemers, Groups, Users)
q = q.join(Groups).join(Users)
q = q.filter(Users.id == FacilityStaff.user_id)
q = q.filter(GroupMembers.group_id == 5).all()
我对这种行为感到有点困惑和困惑。如果不使用backrefs或类似的东西,任何人都可以帮助我解决在连接和过滤方面我可能做错的事情吗?
谢谢!