【发布时间】:2017-01-13 11:21:21
【问题描述】:
我只使用带有 SQLAlchemy 核心 的烧瓶框架。我从“选择”语句返回的结果集包含数千条记录。我想使用分页来避免内存错误。对于任何页面,如何动态地使用 api GET 方法的光标获取 JSON 输出?我在这里How to use cursor() for pagination? 尝试了接受的解决方案,但不能完全正确。请指导。使用 PostgreSQL 9.4 我尝试过的选项:
1.
@app.route('/test/api/v1.0/docs_page/<int:page>', methods=['POST'])
def search_docs_page(page):
if 'id' in session:
doc_list = []
no_of_pgs = 0
doc_list = common_search_code()
# doc_list is a resultset after querying the table for a set of query condition
header_dict = dict(request.headers)
for i in header_dict.items():
if i == 'Max-Per-Page':
max_per_pg = int(header_dict[i])
no_of_pgs = len(doc_list) / max_per_pg
print 'number of doc: ' + str(len(doc_list))
print 'number of pages: ' + str(no_of_pgs)
print 'max per page:' + str(max_per_pg)
print 'page number: '+ str(page)
page = int(request.args.get(page, type=int, default=1))
pagination = Pagination(page=page,
total=len(doc_list),
search=True, record_name='documents')
return jsonify({'pagination': list(pagination.__dict__),
'doc_list': doc_list}), 200
return jsonify({'message': "Unauthorized"}), 401
我想通过在请求标头中传递参数来控制每页要打印的记录数,就像在这个 curl 中一样:
curl -b cookies.txt -X POST http://localhost:8081/test/api/v1.0/docs_page/1 -H 'max_per_page:4' -H 'Content-type:application/json'
@app.route('/test/api/v1.0/docs_page2', methods=['POST'])
def search_docs_page2():
if 'id' in session:
docs = []
no_of_pgs = 0
doc_list = common_search_code()
header_dict = dict(request.headers)
for i in header_dict.items():
if i == 'Max-Per-Page':
max_per_pg = int(header_dict[i])
no_of_pgs = len(doc_list) / max_per_pg
print 'number of doc: ' + str(len(doc_list))
print 'number of pages: ' + str(no_of_pgs)
print 'max per page:' + str(max_per_pg)
page = int(request.form.get('page', type=int, default=1))
cursor = request.form.get('cursor')
if cursor:
print 'hey'
doc_list.with_cursor(cursor)
docs = doc_list.fetchmany(4)
for r in docs:
print r, 'rrrr'
return jsonify({'docs': docs}), 200
return jsonify({'message': "Unauthorized"}), 401
curl:curl -b cookies.txt -X POST http://localhost:8081/test/api/v1.0/docs_page2 -H 'max_per_page:4' -H 'Content-type:application/json' -F 'cursor=1'
【问题讨论】:
-
如果你发布你已经尝试过的东西会更好......
-
dict(header_dict.items())是不必要的。它从字典创建一个新字典。只需遍历header_dict。如果您只关心一个键,请检查该键而不是遍历所有键。max_per_pg = header_dict['Max-Per-Page']. -
common_search_code是否返回光标?你是如何查询数据库的?您使用的是engine.execute还是表格对象?此外,您链接到的问题是关于 Google App Engine 的,不适用于 SQLAlchemy。 -
common_search_code 在应用搜索条件后返回文档列表。我使用了 rs = conn.execute(s),然后根据某些条件创建了此处返回的文档列表。
标签: python pagination sqlalchemy