سكل - الخيمياء تاريخ الاستعلام - الطريقة الأكثر فعالية للاستعلام
-
02-01-2020 - |
سؤال
أحاول إنشاء استعلام ويواجه صعوبة في العثور على الطريقة الأكثر فعالية للقيام بذلك في سكلالشيمي، (ملاحظة أنا باستخدام قارورة-سكلالشيمي)
الهدف هو العثور على جميع المستخدمين لديهم اجتماع مع مستخدم معين.
لذلك دعونا نقول فرانك لديه 10 اجتماعات القادمة ، أريد أن تولد قائمة من جميع الناس فرانك لديه لقاء مع.
هنا نماذج بلدي:
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?
يبدو أنني أفتقد كيف يمكنني فقط استخدام الصلات للحصول على هذه البيانات.أي مساعدة سيكون موضع تقدير!
المحلول
تحتاج إلى الانضمام إلى جدول اجتماع المستخدم مع نفسه ، باستخدام معرف الاجتماع كمفتاح الانضمام.قد تحتاج إلى الاسم المستعار للجدول من أجل الرجوع إليه مرتين.أنا لا أعرف ما إذا كان يمكنني كتابة بناء الجملة سكلالشيمي لذلك قبالة الجزء العلوي من رأسي ، ولكن يبدو سكل مثل:
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
الكائنات مباشرة من القيام بذلك في سكلالكيمي:
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;
نصائح أخرى
إليك إصدار SQLAlchemy للاستعلام للرجوع إليه:
giveacodicetagpre.