Массовая вставка Node.js SQL Server

В этом руководстве вы узнаете, как выполнить команду BULK INSERT в SQL Server из приложения Node.js.

Это руководство начинается с того места, где закончилось руководство по импорту данных из CSV-файла в SQL Server из Node.js.

Мы выполним массовую вставку данных клиентов из CSV-файла в таблицу Customers базы данных BookStore:

  • Используйте пакет csv-parse для чтения данных о клиентах из файла ./data/customers.csv.
  • Используйте пакет mssql для выполнения запроса на массовую вставку.

Массовая вставка данных клиентов

Шаг 1. Создайте новый файл bulk.js в каталоге проекта.

Шаг 2. Скопируйте CSV-файл(customers), содержащий данные о клиентах, в каталог данных:

FirstName,LastName,Email,PhoneNumber,Address
John,Doe, [email protected],123-456-7890,"123 Elm Street, Springfield, IL"
Jane,Smith, [email protected],234-567-8901,"456 Oak Avenue, Metropolis, NY"
Alice,Johnson, [email protected],345-678-9012,"789 Pine Road, Gotham, NJ"

Шаг 3. Определите функцию, которая считывает данные о клиентах из CSV-файла, используя пакет csv-parse:

const readCustomerCSV = async(filename) => {
  const customers = [];
  return new Promise((resolve, reject) => {
    createReadStream(filename)
      .pipe(parse({ columns: true, trim: true }))
      .on('data',(data) => customers.push(data))
      .on('end',() => resolve(customers))
      .on('error',(error) => reject(error));
  });
};

Функция readCustomerCSV возвращает массив объектов клиентов, где каждый объект содержит свойства FirstName, LastName, Email, PhoneNumber и Address.

Шаг 4. Определите функцию insertCustomers, которая выполняет массовую вставку данных о клиентах из файла customers.csv в таблицу Customers:

const insertCustomers = async(filename) => {
  try {
    // read customer data from a CSV file
    const customers = await readCustomerCSV(filename);
    // Connect to the SQL Server
    await sql.connect(config);
    // Initialize a Table object
    const table = new sql.Table('Customers');
    // Set to false because the table already exists.
    // If the table does not exist, set to true , it will create the table
    table.create = false;
    table.columns.add('FirstName', sql.VarChar(100), { nullable: false });
    table.columns.add('LastName', sql.VarChar(100), { nullable: false });
    table.columns.add('Email', sql.VarChar(255), { nullable: false });
    table.columns.add('PhoneNumber', sql.VarChar(20), { nullable: false });
    table.columns.add('Address', sql.VarChar(255), { nullable: false });
    // Add rows to the table
    customers.forEach((c) => {
      table.rows.add(
        c.FirstName,
        c.LastName,
        c.Email,
        c.PhoneNumber,
        c.Address
      );
    });
    // Create a new bulk request to the Customers table
    const request = new sql.Request();
    // Execute the bulk insert
    request.bulk(table);
  } catch(err) {
    console.error(err);
  }
};

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

Сначала считайте данные из CSV-файла, вызвав функцию readCustomerCSV:

const customers = await readCustomerCSV(filename);

Во-вторых, подключитесь к SQL Server:

await sql.connect(config);

В-третьих, инициализируйте объект Table с именем таблицы Customers:

const table = new sql.Table('Customers');

Поскольку таблица Customers уже существует, установите свойство create в значение false:

table.create = false;

Обратите внимание: если таблица не существует и вы устанавливаете свойство create в значение true, таблица Customers будет автоматически создана в SQL Server.

В-четвертых, определите столбцы для таблицы «Клиенты».

table.columns.add('FirstName', sql.VarChar(100), { nullable: false });
table.columns.add('LastName', sql.VarChar(100), { nullable: false });
table.columns.add('Email', sql.VarChar(255), { nullable: false });
table.columns.add('PhoneNumber', sql.VarChar(20), { nullable: false });
table.columns.add('Address', sql.VarChar(255), { nullable: false });

Обратите внимание, что этот шаг необходим, даже если таблица Customers уже существует. Кроме того, если таблица Customers не существует, вам также необходимо определить столбец первичного ключа(CustomerID).

В-пятых, добавьте строки в таблицу «Клиенты»:

customers.forEach((c) => {
  table.rows.add(c.FirstName, c.LastName, c.Email, c.PhoneNumber, c.Address);
});

В-шестых, создайте массовый запрос к таблице Customers:

const request = new sql.Request();
request.bulk(table);

Наконец, отобразите ошибку, если она возникла в блоке catch:

console.error(err);

Вот полный файл bulk.js:

import { createReadStream } from 'fs';
import { parse } from 'csv-parse';
import sql from 'mssql';
import { config } from './config.js';
const readCustomerCSV = async(filename) => {
  const customers = [];
  return new Promise((resolve, reject) => {
    createReadStream(filename)
      .pipe(parse({ columns: true, trim: true }))
      .on('data',(data) => customers.push(data))
      .on('end',() => resolve(customers))
      .on('error',(error) => reject(error));
  });
};
const insertCustomers = async(filename) => {
  try {
    // read customer data from a CSV file
    const customers = await readCustomerCSV(filename);
    // Connect to the SQL Server
    await sql.connect(config);
    // Initialize a Table object
    const table = new sql.Table('Customers');
    // Set to false because the table already exists.
    // If the table does not exist, set to true , it will create the table
    table.create = false;
    table.columns.add('FirstName', sql.VarChar(100), { nullable: false });
    table.columns.add('LastName', sql.VarChar(100), { nullable: false });
    table.columns.add('Email', sql.VarChar(255), { nullable: false });
    table.columns.add('PhoneNumber', sql.VarChar(20), { nullable: false });
    table.columns.add('Address', sql.VarChar(255), { nullable: false });
    // Add rows to the table
    // Add rows to the table
    customers.forEach((c) => {
      table.rows.add(
        c.FirstName,
        c.LastName,
        c.Email,
        c.PhoneNumber,
        c.Address
      );
    });
    // Create a new bulk request to the Customers table
    const request = new sql.Request();
    // Execute the bulk insert
    request.bulk(table);
  } catch(err) {
    console.error(err);
  }
};
export { insertCustomers };

Шаг 5. Измените файл index.js для чтения данных из файла ./data/customer.csv и массовой вставки их в таблицу Customers:

import { insertCustomers } from './bulk.js';
insertCustomers('./data/customers.csv');

Шаг 6. Выполните следующую команду для запуска файла bulk.js:

npm start

Проверка массовой вставки

Шаг 1. Запустите SQL Server Management Studio и подключитесь к SQL Server.

Шаг 2. Выполните следующую команду для извлечения данных из таблицы Customers:

SELECT * FROM customers;

Выход:

Пример массовой вставки сервера node.js sql

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

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

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

  • Создайте объект Table и вызовите метод bulk() для выполнения запроса на массовую вставку в SQL Server.
Мирослав С.

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