在sql分页中保持列表的顺序

时间:2016-02-12 00:49:44

标签: python postgresql flask sqlalchemy flask-sqlalchemy

我有一个包含插入顺序的列表。我想使用相同的顺序对结果进行分页。正如您目前所看到的,输出将是不同的顺序。

following_companies_list_data = Company.query.filter(Company.id.in_(['2', '24', '1', '7', '373'])).paginate(
            page, per_page=10, error_out=False)

companies = following_companies_list_data.items

for i in companies:
    print i.id

7
24
373
2
1

相关question

2 个答案:

答案 0 :(得分:7)

基于相关问题{/ 3>的this answer的解决方案

company_ids = ['2', '24', '1', '7', '373']
order_expressions = [(Company.id==i).desc() for i in company_ids]
query = Company.query.filter(Company.id.in_(company_ids)).order_by(*order_expressions)
following_companies_list_data = query.paginate(page, per_page=10, error_out=False)

您也可以使用intarray模块中的idx功能

from sqlalchemy import func
company_ids = ['2', '24', '1', '7', '373']
query = Company.query.filter(Company.id.in_(company_ids)).order_by(func.idx(company_ids, Company.id))
following_companies_list_data = query.paginate(page, per_page=10, error_out=False)

答案 1 :(得分:1)

我认为最简单的方法是在查询之前对您的ID列表进行分页:

company_ids_page = company_ids[page * 10:(page + 1) * 10]
q = Company.query.filter(Company.id.in_(company_ids_page))

然后,根据您的ID顺序对公司进行重新排序:

companies_map = {c.id: c for c in q}
companies = [companies_map[i] for i in company_ids_page]

如果你需要Pagination个对象的精彩功能,你可以为列表创建一个类似的类。