FLASK SQLAlchemy查询以多对多关系运行很长时间

时间:2019-02-08 14:03:17

标签: python mysql flask sqlalchemy flask-sqlalchemy

我有一个旅馆预订表,它需要引用一对多对多的表。建立连接的正确方法是什么

我有一个包含4个表的MySQL数据库: 预订

资源 --BOOKABLE_ROOMS(连接表) ROOM_TYPES

创建预订时,它需要引用度假胜地(即酒店名称)和room_type(即标准的2张大床,1张特大床等),但我还需要限制哪些酒店具有哪种房型为什么我在这两个表之间有很多对很多。

到目前为止,我已经将联结表主键(BOOKABLE_ROOMS)保存为新的保留表中的外键。这在技术上一直有效,但是在使用Flask和SQLalchemy进行查询时非常慢。我看到它然后对每个预订查询都进行多个查询。在预订和bookable_room(resort + room_type)之间是否存在更正确的方式来存储这种关系?

现在,我将结点表作为一个类,但是在进行研究时,我发现这样做是不鼓励的,我应该只使用表。如果这样做,如何在预订表中引用度假村+ 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)

我希望能够在不为每个可预订房间运行数百个查询的情况下提取预订表

0 个答案:

没有答案