首页 > 解决方案 > 烧瓶 SQLAlchemy 棉花糖 | 如何查询两个 ID 值之间的所有条目

问题描述

我希望能够查询数据库并将jsonify()结果通过服务器发送。

我的函数应该在每次调用时递增地发送帖子x数量,即发送帖子 1 - 10,...,发送帖子 31 - 40,...

我有以下查询:

q = Post.query.filter(Post.column.between(x, x + 10))
result = posts_schema.dump(q)

return make_response(jsonify(result), 200) // or would it be ...jsonify(result.data), 200)?

理想情况下,它会返回如下内容:

[
  {
    "id": 1,
    "title": "Title",
    "description": "A descriptive description."
  },
  {
    "id": 2,
    ...
  },
  ...
]

我正在使用的 SQLAlchemy 模型和 Marshmallow 模式:

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(30))
    content = db.Column(db.String(150))

    def __init__(self, title, description):
        self.title = title
        self.description = description


class PostSchema(ma.Schema):
    class Meta:
        fields = ('id', 'title', 'description')


posts_schema = PostSchema(many=True)

我是新手SQLAlchemy,所以我对查询还不太了解。另一个用户必须用当前查询向我指出我现在所处的方向,但我认为这不太正确。

在 SQL 中,我希望重现以下内容:

SELECT * FROM Post WHERE id BETWEEN value1 AND value2

标签: pythonsqliteflasksqlalchemymarshmallow

解决方案


要使用 SQL Alchemy 进行分页,您需要执行以下操作:


# In the view function, collect the page and per page values
@app.route(''/posts/<int:page>/<int:per_page>', methods=['GET'])
def posts(page=1, per_page=30):
    #... insert other logic here

    posts = Post.query.order_by(Post.id.asc())  # don't forget to order these by ID
    posts = posts.paginate(page=page, per_page=per_page)

    return jsonify({
        'page': page,
        'per_page': per_page,
        'has_next': posts.has_next,
        'has_prev': posts.has_prev,
        'page_list': [iter_page if iter_page else '...' for iter_page in posts.iter_pages()],
        'posts': [{
            'id': p.id,
            'title': p.title,
            'content': p.content
        } for p in posts.items]
    })


在前端,您将使用page_listpageper_pagehas_nexthas_prev值来帮助用户选择下一个要转到的页面。

您在 URL 中传递的值将指示下一个要转到的页面。这一切都为您方便地内置到 SQLAlchemy 中,这也是它如此出色的库的另一个原因。


推荐阅读