首页 > 解决方案 > 我正在使用烧瓶,flask_sqlalchemy 分页功能适用于 page1,但不适用于其他页面

问题描述

我已连接到现有的Ms Access数据库。我的模型看起来像

class Suppliers(db.Model):

   __tablename__ = 'Suppliers'
   SupplierID = db.Column('SupplierID', db.Integer, primary_key=True)
   __table_args__ = {'autoload': True,'autoload_with': db.engine}
   def __repr__(self):
      return f"Suppliers('{self.SupplierID}', '{self.SupplierName}')"
   def as_dict(self):
      return {"SupplierID": self.SupplierID, "SupplierName": 
          self.SupplierName}

在视图中,我的查询仅适用于 page=1,但当页面大于 1 时,即 page=2 时,它不起作用;分页查询返回所有项目而不是从 20 到 39 的项目(当 page=2 时,每-page=20) 等等

 "sArgs": {"searchString": "sometext","searchPage": 1, "perPage": 20, "orderBy": "SupplierName"}

queryResults = Suppliers.query.filter(Suppliers.SupplierName.like('%'+sArgs['searchString']+'%'))
               .order_by(asc(sArgs['orderBy']
                )).paginate(
                page=int(
                    sArgs['searchPage']
                    ), per_page=sArgs['perPage']
                )

但它在以下情况下不起作用:“sArgs”:{“searchString”:“sometext”,“searchPage”:2,“perPage”:20,“orderBy”:“SupplierName”}。

当我使用sqlite DB 时,同样可以正常工作。 我无法找出这里的问题。请帮助我找到解决方案。感谢您的时间。

标签: pythonflaskflask-sqlalchemy

解决方案


我尝试使用 mysql 创建一个简单的表,它有一个主键作为 ID 和一个包含一些城市名称的名称,尝试使用相同的逻辑过滤记录,我能够完成它,下面是代码片段相同的 。请检查这是否可以解决您的问题,与您的代码段的唯一区别是我提到了“max_per_page”参数,并且我直接用 like 提到了带有模型名称的实体名称。代码段如下所示。

queryResults = City.query.filter(City.name.like("%as%")).order_by(asc("name")).paginate(page=2, error_out=False, max_per_page=15)

完整片段:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import asc

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://***:***@***/***'
db = SQLAlchemy(app)

class City(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))

    def __init__(self, name, email):
        self.name = name

    def __repr__(self):
        return '<City Name %r>' % self.name

queryResults = City.query.filter(City.name.like("%as%")).order_by(asc("name")).paginate(page=2, error_out=False, max_per_page=15)

result = dict(datas=queryResults.items, 
                   total=queryResults.total, 
                   current_page=queryResults.page,
                   per_page=queryResults.per_page)

print(result)

输出 :

{'datas': [<City Name 'Ashdod'>, <City Name 'Ashgabat'>, <City Name 'Ashikaga'>, <City Name 'Ashoknagar-Kalyangarh'>, <City Name 'Ashqelon'>, <City Name 'Asmara'>, <City Name 'Assuan'>, <City Name 'Astana'>, <City Name 'Astrahan'>, <City Name 'Asunción'>, <City Name 'Asyut'>, <City Name 'Ã\x81guas Lindas de Goiás'>, <City Name 'Bandar-e-Abbas'>, <City Name 'Banjarmasin'>, <City Name 'Barasat'>], 'total': 232, 'current_page': 2, 'per_page': 15}

推荐阅读