В этом руководстве вы узнаете, как выполнить команду 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;
Выход:
Загрузите исходный код проекта
Загрузите исходный код проекта
Краткое содержание
- Создайте объект Table и вызовите метод bulk() для выполнения запроса на массовую вставку в SQL Server.