Несколько условий для объединения столбца таблицы в SQLAlchemy

#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()