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_list
、page
、per_page
、has_next
和 has_prev
值来帮助用户选择进入下一页。
您在 URL 中传递的值将决定要转到的下一页。 SQLAlchemy 为您轻松内置了这一切,这也是它如此出色的库的另一个原因。
我找到了问题的解决方案:
Post.query.filter((Post.id >= x) & (Post.id <= (x + 10))).all()
我希望能够查询数据库并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_list
、page
、per_page
、has_next
和 has_prev
值来帮助用户选择进入下一页。
您在 URL 中传递的值将决定要转到的下一页。 SQLAlchemy 为您轻松内置了这一切,这也是它如此出色的库的另一个原因。
我找到了问题的解决方案:
Post.query.filter((Post.id >= x) & (Post.id <= (x + 10))).all()