Node.js SQL Server: разбиение на страницы

В этом уроке вы узнаете, как выполнять пагинацию с использованием предложений OFFSET и FETCH в Node.js.

Этот урок начинается с того места, где закончился урок «Выбор данных из таблицы в Node.js».

Пагинация — это метод разбиения большого набора данных на более мелкие, более управляемые фрагменты(страницы) для целей отображения.

В SQL Server можно совместно использовать предложения OFFSET и FETCH для реализации пагинации.

Пагинация с использованием предложений OFFSET и FETCH

Мы извлечем данные из таблицы Authors, используя предложения OFFSET и FETCH.

Шаг 1. Измените файл select.js и определите новую функцию findAuthors, которая извлекает авторов с помощью предложений OFFSET и FETCH:

async function findAuthors(limit = 5, offset = 0) {
  try {
    // Connect to the database
    const pool = await sql.connect(config);
    // Execute a query
    const result = await pool
      .request()
      .input('offset', sql.Int, offset)
      .input('limit', sql.Int, limit)
      .query(
        `SELECT * FROM Authors 
         ORDER BY FirstName
         OFFSET @offset ROWS 
         FETCH FIRST @limit ROWS ONLY`
      );
    return result.recordset;
  } catch(err) {
    console.error('Error finding authors:', err);
  }
}

Как это работает.

Сначала подключитесь к SQL Server:

const pool = await sql.connect(config);

Во-вторых, извлеките авторов, используя предложения OFFSET и FETCH, отсортированные по FirstName в порядке возрастания:

const result = await pool
  .request()
  .input('offset', sql.Int, offset)
  .input('limit', sql.Int, limit)
  .query(
    `SELECT * FROM Authors 
         ORDER BY FirstName
         OFFSET @offset ROWS 
         FETCH FIRST @limit ROWS ONLY`
  );

В этом заявлении:

  • pool.request() создает новый экземпляр Request, представляющий запрос для выполнения к базе данных.
  • .input(name, type, value) определяет входные параметры для запроса. В этом случае мы используем его для определения трех параметров offset и limit.
  • .query(sqlQuery) выполняет SQL-запрос, используя входные параметры offset, limit и sort.

В-третьих, верните набор записей:

return result.recordset;

Шаг 2. Экспортируйте функцию findAuthors с другими функциями:

export { findAuthorById, findAuthorsByLastName, findAuthors };

Шаг 3. Измените index.js для использования функции findAuthors:

import { findAuthors } from './select.js';
const authors = await findAuthors(5);
for(const { AuthorID, FirstName, LastName } of authors) {
  console.log(`${AuthorID} - ${FirstName} ${LastName}`);
}

Выход:

2 - Agatha Christie
5 - Agatha Christie
9 - Charles Dickens
22 - Emily Bronte
11 - Ernest Hemingway

Как это работает.

Сначала импортируйте findAuthors из модуля select.js:

import { findAuthors } from './select.js';

Во-вторых, вызовите функцию findAuthors, чтобы получить первых 5 авторов, отсортированных по их именам:

const authors = await findAuthors(5);

В-третьих, отобразите на консоли идентификатор автора, его имя и фамилию:

for(const { AuthorID, FirstName, LastName } of authors) {
  console.log(`${AuthorID} - ${FirstName} ${LastName}`);
}

Чтобы получить следующих 5 авторов, вы можете передать второй аргумент следующим образом:

const authors = await findAuthors(5, 5);

Он вернет следующие записи:

10 - F. Scott Fitzgerald
7 - George Orwell
1 - George Orwell
18 - H.G. Wells
17 - Harper Lee

Загрузите исходный код проекта

Загрузите исходный код проекта

Краткое содержание

  • Используйте предложения OFFSET и FETCH для реализации функции разбиения на страницы при выборе данных.
Мирослав С.

Автор статей, ИБ-специалист