FlaskSQL alchemy由于多个外键导致插入缓慢

2024-09-28 21:00:58 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我目前正在尝试使用flask restful为后端构建一个新的应用程序,我仍然在学习,因为所有这些对我来说都是全新的。我已经用几个不同的mySQL表设置了所有内容,下面详细介绍了它们之间的关系,所有内容似乎都运行良好,只是插入新数据的过程非常缓慢

下面是我对当前设置的(简化)解释。基本上,我首先有一张航班表

class FlightModel(db.Model):

    __tablename__ = "Flights"

    flightid = db.Column(db.Integer, primary_key = True, nullable=False)
    [Other properties]

    reviewid = db.Column(db.Integer, db.ForeignKey('Reviews.reviewid'), index = True, nullable = False)
    review = db.relationship("ReviewModel", back_populates="flight", lazy='joined')

然后,该表指向一个Reviews表,我在其中存储用户留下的全局评论

class ReviewModel(db.Model):

    __tablename__ = "Reviews"

    reviewid = db.Column(db.Integer, primary_key = True, nullable = False)
    [Other properties]

    depAirportReviewid = db.Column(db.Integer, db.ForeignKey('DepAirportReviews.reviewid'), index=True, nullable = False)
    arrAirportReviewid = db.Column(db.Integer, db.ForeignKey('ArrAirportReviews.reviewid'), index=True, nullable = False)
    airlineReviewid = db.Column(db.Integer, db.ForeignKey('AirlineReviews.reviewid'), index=True, nullable = False)

    flight = db.relationship("FlightModel", uselist=False, back_populates="review", lazy='joined')
    depAirportReview = db.relationship("DepAirportReviewModel", back_populates="review", lazy='joined')
    arrAirportReview = db.relationship("ArrAirportReviewModel", back_populates="review", lazy='joined')
    airlineReview = db.relationship("AirlineReviewModel", back_populates="review", lazy='joined')

然后,可以在另一个表(例如,在下面的DepAirportReviews表中:此级别共有三个表)中存储关于航班不同方面的更详细的审查

class DepAirportReviewModel(db.Model):

    __tablename__ = "DepAirportReviews"

    reviewid = db.Column(db.Integer, primary_key = True, nullable = False)
    [Other properties]

    review = db.relationship("ReviewModel", uselist=False, back_populates="depAirportReview", lazy='joined')

插入过程很慢(每次飞行插入通常需要1秒,当我尝试批量插入几百个时,这是一个问题)

我理解这是因为所有这些关系以及它所暗示的所有数据库访问,以便为不同的表检索不同的ID。对吗?我可以做些什么来解决这个问题,或者我需要重新设计表来删除其中的一些关系吗

谢谢你的帮助

编辑:显示直接执行的SQL显示了我的预期:每次插入总共执行7个简单查询,每次执行约300毫秒。它相当长,我想主要是由于到达服务器的时间。除了保留一些外键什么都没做,对吗


Tags: falsetruedbindexbackcolumnintegerreview