📜  sequelize 分页 postgres - Javascript (1)

📅  最后修改于: 2023-12-03 15:34:56.518000             🧑  作者: Mango

Sequelize 分页 Postgres - JavaScript


Sequelize 是一个 Node.js 的 ORM 框架,它支持多种关系型数据库,包括 MySQL、PostgreSQL、SQLite 和 Microsoft SQL Server。如果您需要使用 PostgreSQL 数据库并实现分页,则 Sequelze 又是一个非常好的选择。

在这篇文章中,我们将介绍如何在 JavaScript 中使用 Sequelize 框架来实现 PostgreSQL 数据库的分页功能。我们将讲解如何使用 Sequelize 查询器和 PostgreSQL 的 OFFSET 和 LIMIT 语句来实现分页功能。

前置条件

在本文中,我们假设您已经安装了 Node.js 和 Sequelize,并且已经配置好了 PostgreSQL 数据库。

实现分页

要实现分页功能,我们需要使用 Sequelize 查询器的一些方法,例如 findAllfindAndCountAll。我们还需要知道如何使用 OFFSET 和 LIMIT 语句来查询数据库中的数据。

使用 OFFSET 和 LIMIT

OFFSET 和 LIMIT 语句是 PostgreSQL 数据库用于分页的关键。使用 OFFSET 和 LIMIT 语句,可以从结果集中获取特定范围内的数据。

假设我们有一个包含以下数据的表 users

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255),
  email VARCHAR(255),
  age INTEGER,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

我们可以使用 OFFSET 和 LIMIT 语句来查询前 10 个用户:

SELECT * FROM users ORDER BY created_at DESC OFFSET 0 LIMIT 10;

上面的查询语句将返回最新的前 10 个用户。

使用 Sequelize 实现分页

现在,我们已经知道了如何使用 OFFSET 和 LIMIT 语句来查询数据库中的数据,下面是如何使用 Sequelize 实现分页的过程。

以下是我们的用户模型:

const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'postgres',
});

class User extends Model {}
User.init(
  {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    age: DataTypes.INTEGER,
  },
  {
    sequelize,
    modelName: 'user',
  }
);

module.exports = User;

我们使用 findAll 方法来查询数据库中的数据,并使用 findAndCountAll 方法返回总记录数和分页数据。

首先,使用 findAll 方法查询所有数据,然后使用 offset 和 limit 参数来获取特定范围内的数据。以下是查询语句的示例:

const users = await User.findAll({
  order: [['created_at', 'DESC']],
  offset: 0,
  limit: 10,
});

在上面的代码段中,我们将 offset 设置为 0,将 limit 设置为 10,这将返回最新的前 10 个用户。我们还使用 order 选项指定所需的排序方式。

接下来,我们使用 findAndCountAll 方法返回总记录数和分页数据:

const { count, rows } = await User.findAndCountAll({
  order: [['created_at', 'DESC']],
  offset: 0,
  limit: 10,
});

在上面的代码段中,我们使用 findAndCountAll 方法来查询所有数据并返回总记录数和分页数据。count 变量将包含总记录数,rows 变量将包含查询到的所有数据。同样,我们使用 order 选项指定所需的排序方式。

完整示例

下面是一个完整的实现分页的示例:

const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'postgres',
});

class User extends Model {}
User.init(
  {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    age: DataTypes.INTEGER,
  },
  {
    sequelize,
    modelName: 'user',
  }
);

async function getPage(pageNumber, pageSize) {
  try {
    const offset = (pageNumber - 1) * pageSize;
    const { count, rows } = await User.findAndCountAll({
      order: [['created_at', 'DESC']],
      offset,
      limit: pageSize,
    });
    const totalPages = Math.ceil(count / pageSize);

    const result = {
      count,
      totalPages,
      pageNumber,
      pageSize,
      rows,
    };

    return result;
  } catch (error) {
    console.log(error);
    throw error;
  }
}

module.exports = { User, getPage };

在上面的代码段中,getPage 函数接受 pageNumberpageSize 参数,并返回特定页面的数据以及总页面数。我们计算 offset,使用 findAndCountAll 方法查询数据,再将数据保存到 result 变量中。

结论

通过这篇文章,我们了解了如何在 JavaScript 中使用 Sequelize 框架实现 PostgreSQL 数据库的分页功能。我们讲述了使用 Sequelize 查询器和 PostgreSQL 的 OFFSET 和 LIMIT 语句来实现分页功能,并提供了一个完整的示例。使用 Sequelize 分页 Postgres,可以轻松地处理大量数据和分页问题。