gpt4 book ai didi

python - SQLAlchemy 连接查询 - 最有效的查询方式

转载 作者:行者123 更新时间:2023-12-03 17:33:02 25 4
gpt4 key购买 nike

我正在尝试生成一个查询,但很难在 sqlalchemy 中找到最有效的方法,(注意我使用的是 flask-sqlalchemy)

目标是找到所有用户都与特定用户开会。

因此,假设 Frank 有 10 场 session 即将召开,我想生成一个 frank 与之会面的所有人的列表。

这是我的模型:

class UserMeeting(db.Model):
""" Associative table, links meetings to users in a many to many fashion"""
__tablename__ = 'userMeeting'
id = db.Column(db.Integer, primary_key = True)
meeting_id = db.Column(db.Integer, db.ForeignKey('meeting.id'), primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)

class Meeting(db.Model):
__tablename__ = "meeting"
id = db.Column(db.Integer, primary_key = True)
title = db.Column(db.String(128))
#... other columns
#associative reference
attendees = db.relationship('UserMeeting', backref='meeting')

class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key = True)
email = db.Column(db.String(128), index=True, unique=True)
password = db.Column(db.String(128))
#associative reference
attendingMeetings = db.relationship("UserMeeting", backref="user", cascade="all, delete-orphan")

这是我尝试过的:
#Assume frank's a user with id == 1
frank = User.query.get(1)
franks_meetings = Meeting.query.join(Meeting.attendees).filter(UserMeeting.user == frank).all()
#not efficient way of getting users in meetings with frank
users = []
for meeting in franks_meetings:
for userMeeting in meeting.attendees:
if userMeeting.user != frank:
users.append(userMeeting.user)

#is there a way to just generate one query and get this data?

我似乎错过了如何使用连接来获取这些数据。任何帮助,将不胜感激!

最佳答案

您需要使用 meeting_id 作为连接键将 UserMeeting 表与其自身连接起来。您可能需要为该表设置别名才能引用它两次。我不知道我是否可以在脑海中为它输入 sqlalchemy 语法,但 sql 看起来像:

select distinct(b.user_id) as other_user_id
from usermeeting a
inner join usermeeting b
on a.meeting_id=b.meeting_id
where a.user_id=1 and b.user_id != 1;

1是弗兰克。

哦,还有获取用户详细信息。也许你最终会得到 User直接在 sqlalchemy 中执行此操作的对象:
select distinct(u.id), u.email
from usermeeting a
inner join usermeeting b
on a.meeting_id=b.meeting_id
inner join users u
on b.user_id=u.id
where a.user_id=1 and b.user_id != 1;

关于python - SQLAlchemy 连接查询 - 最有效的查询方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25090375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com