FLASK SQLAlchemy запросы выполняются очень долго с отношением многие ко многим - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть одна таблица бронирования отелей, и она должна ссылаться на другую пару таблиц, которые имеют отношение многие ко многим.Как правильно установить это соединение

У меня есть база данных MySQL с 4 таблицами: RESERVATIONS

RESORTS --BOOKABLE_ROOMS (таблица соединений) ROOM_TYPES

Когда резервированиеДля этого требуется ссылка на курорт (т. е. название отеля) и тип номера (т. е. стандартные 2 королева, 1 король и т. д.), но мне также нужно ограничить его тем, какие отели имеют типы номеров, поэтому у меня есть много ко многиммежду этими двумя таблицами.

До сих пор я сохранял первичный ключ соединительной таблицы (BOOKABLE_ROOMS) в новой таблице резервирования как внешний ключ.Технически это работает, но очень медленно при выполнении запросов с использованием Flask с SQLalchemy.Я вижу, что затем делает несколько запросов для каждого поиска резервирования.Есть ли более правильный способ сохранить эти отношения между резервированием и bookable_room (resort + room_type)?

Сейчас у меня есть соединительная таблица в качестве класса, но при проведении исследований я обнаружил, что это не рекомендуется и чтоЯ должен просто использовать стол.Если я сделаю это, как мне сделать ссылку на комбинацию resort + room_type в таблице резервирования?

Я также безуспешно пытался связываться с различными ленивыми вариантами.

class Resort(db.Model, AddUpdateDelete):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), unique=True, nullable=False)
    bookable_rooms = db.relationship('BookableRoom', backref='resort')

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "Resort(%s) - ID(%s)" % (self.name, self.id)


class RoomType(db.Model, AddUpdateDelete):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), unique=True, nullable=False)
    sleeps = db.Column(db.Integer, nullable=True)
    bookable_rooms = db.relationship('BookableRoom', backref='room_type')

    def __init__(self, name, **kwargs):
        self.name = name
        if 'sleeps' in kwargs:
            self.sleeps = kwargs['sleeps']

    def __repr__(self):
        return "Room Type(%s) - ID(%s) - Sleeps(%s)" % (self.name, self.id, self.sleeps)


class BookableRoom(db.Model, AddUpdateDelete):
    id = db.Column(db.Integer, primary_key=True)
    resort_id = db.Column(db.Integer, db.ForeignKey('resort.id'), nullable=False)
    room_type_id = db.Column(db.Integer, db.ForeignKey('room_type.id'), nullable=False)
    reservations = db.relationship('Reservation', backref='bookable_room', lazy='dynamic')

    def __init__(self, resort, room_type):
        self.resort = resort
        self.room_type = room_type

    def __repr__(self):
        return "Bookable Room = %s at %s" % (self.room_type.name, self.resort.name)

class Reservation(db.Model, AddUpdateDelete):
    id = db.Column(db.Integer, primary_key=True)
    check_in_date = db.Column(db.DateTime, nullable=False)
    check_out_date = db.Column(db.DateTime, nullable=False)
    notes = db.Column(db.String(255))
    bookable_room_id = db.Column(db.Integer, db.ForeignKey('bookable_room.id'), nullable=False)
    owner_id = db.Column(db.Integer, db.ForeignKey('owner.id'), nullable=False)
    booked_date = db.Column(db.DateTime, nullable=False)
    points_needed = db.Column(db.Integer, nullable=False)

    def __init__(self, owner, bookable_room):
        self.owner = owner
        self.bookable_room = bookable_room

    def __repr__(self):
        return "Trip - %s(%s %s-%s) %s" % (self.id, self.owner.name,
                                           self.bookable_room.resort.name,
                                           self.bookable_room.room_type.name,
                                           self.check_in_date)

Я хочучтобы иметь возможность открыть таблицу резервирования без выполнения сотен запросов для каждой бронируемой комнаты

...