SQL-Alchemy 쿼리 조회 - 가장 효율적인 쿼리 방법
-
02-01-2020 - |
문제
나는 쿼리를 생성하고 SqlAlchemy에서 가장 효율적인 방법을 찾는 데 어려움을 겪고있다 (플라스크 - sqlalchemy를 사용하고있다)
모든 사용자가 특정 사용자와의 만남을 찾는 것입니다.
프랭크가 10 회의 회의가 나오고 있기 때문에 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
는 프랭크입니다.
OH, 그리고 사용자 세부 정보도 얻는 것도.아마 SQLALCHEMES 에서이 작업을 직접 끝내지 못하게 할 수 있습니다.
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;
. 다른 팁
참조 용 쿼리의 SQLALCHEMES 버전은 다음과 같습니다.
#get all users in meetings with Frank, (frank.id == 1)
um = aliased(UserMeeting)
frank = User.query.get(1)
q = session.query(User).join(User.attendingMeetings).\
filter(UserMeeting.meeting_id == um.meeting_id).\
filter(UserMeeting.user_id != frank.id, um.user_id == frank.id)
users_meeting_with_frank = q.all()
. 제휴하지 않습니다 StackOverflow