#python #sql #join #sqlalchemy
#python #sql #Присоединиться #sqlalchemy
Вопрос:
У меня есть две модели:
class Room(Base, SerializerMixin):
__tablename__ = "rooms"
id = Column(String, primary_key=True)
last_updated = Column(Integer)
participants = relationship("RoomParticipant")
def __init__(self, p_id, last_updated):
self.id = p_id
self.last_updated = last_updated
class RoomParticipant(Base, SerializerMixin):
__tablename__ = "room_participants"
id = Column(String, primary_key=True)
room_id = Column(String, ForeignKey("rooms.id"))
user_id = Column(String, ForeignKey("users.id"))
user = relationship("User", load_on_pending=True)
def __init__(self, p_id, room_id, user_id):
self.id = p_id
self.room_id = room_id
self.user_id = user_id
Например: у меня есть одна строка в rooms
таблице с id=3
. И у меня есть две строки в room_participants
таблице: первая с id=1
, а вторая с id=2
. И room_id
столбец каждой строки в таблице room_participants равен 3
. Я знаю эти два id
с. И теперь мне нужно сделать что-то вроде: «дайте мне строку из rooms
таблицы, в которой есть строка с id=1
и строка с id=2
из room_participants
таблицы в качестве отношения».
Как должен выглядеть запрос SQLAlchemy? И возможно ли это вообще? Заранее спасибо)
Ответ №1:
Через 5 дней я только что нашел решение. in_
Функция помогла.
@classmethod
def get(cls, user1_id, user2_id) -> Room:
return DBSession.query(Room)
.join(RoomParticipant, DM.id == RoomParticipant.dm_id, isouter=True)
.filter(RoomParticipant.user_id.in_((user1_id, user2_id)))
.group_by(Room.id)
.having(func.count(distinct(RoomParticipant.user_id)) == 2)
.first()