Flask SQLAlchemy 棉花糖 |如何查询两个 ID 值之间的所有条目

Flask SQLAlchemy Marshmallow | How do I query all entries between two ID values

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

我的函数应该在每次调用时递增地发送 x 数量的 posts,即 Sending posts 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)?

理想情况下,它会 return 像这样:

[
  {
    "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

要使用 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 为您轻松内置了这一切,这也是它如此出色的库的另一个原因。

我找到了问题的解决方案:

Post.query.filter((Post.id >= x) & (Post.id <= (x + 10))).all()