使用关联表

时间:2018-06-07 12:29:51

标签: python sqlalchemy flask-sqlalchemy

我在Flask-SQLAlchemy(帖子评论)中有两个模型,它们具有多对多关系,在第三个模型中表现出来( post_mentions ):

post_mentions = db.Table(
    'post_mentions',
    db.Column('post_id', db.Integer, db.ForeignKey('posts.id'), primary_key=True),
    db.Column('comment_id', db.Integer, db.ForeignKey('comments.id'), primary_key=True),
)

class Post(db.Model):
    __tablename__ = 'posts'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, unique=True, nullable=False)
    mentions = db.relationship('Comment', secondary=post_mentions, lazy='dynamic')

    def __eq__(self, other):
        return self.name.lower() == other.name.lower()

    def __hash__(self):
        return hash(self.name.lower())


class Comment(db.Model):
    __tablename__ = 'comments'

    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.Text, nullable=False)
    created_at = db.Column(db.Integer, nullable=False)

还有 / posts 端点触发以下查询:

# flask and other imports

@app.route('/posts')
def posts():
    page_num = request.args.get('page', 1)
    posts = models.Post.query.join(models.post_mentions)\
                             .group_by(models.post_mentions.columns.post_id)\
                             .order_by(func.count(models.post_mentions.columns.post_id).desc())\
                             .paginate(page=int(page_num), per_page=25)
    return render_template('posts.html', posts=posts)

SQLite数据库中存储了超过14k +的帖子和32k +的评论。从上面的代码片段可以看出,当某人点击 / posts 端点时,SQLAlchemy会立即将所有数据加载到内存中,然后再加载后续查询(例如检索帖子,对该帖子发表评论等)。需要亚毫秒的时间,因为数据是从内存提供的,而不会访问数据库。在我的笔记本电脑上初始加载需要10s +,这是温和的,不是最理想的。

所以问题是:考虑到用户不会查看97%以上的帖子,我如何按照提及次数(在评论中)订购帖子并按需加载而不是一次性完成?

0 个答案:

没有答案