В этом посте я покажу, как мне удалось заставить мое приложение NodeJS выполнять мои SQL-запросы из файла SQL с использованием sqlite3 и fs API-интерфейсов NodeJS. Даже если вы не используете SQLite, вы все равно можете найти метод, который я использовал здесь, полезным (вы можете просто пропустить отдельные части SQLite).

Предпосылки: файл SQL, который мне требовалось использовать для запуска и запуска моей базы данных SQLite, содержал ровно 195 369 строк кода SQL! Мне нужно было получить эти запросы к БД, и лучший способ - программно, но как?

Если вы окажетесь в такой ситуации, этот пост о том, как мне удалось выполнить это задание безопасно и вовремя.

Следующие шаги я предпринял.

Шаг 1, установите пакет NPM с именем sqlite3 (прочтите документацию по sqlite3 здесь). sqlite3 помогает подключаться к базе данных SQLite и выполнять запросы.

Шаг 2. В вашем JS-файле, в котором вы хотите запускать SQL-запросы, импортируйте / требуйте sqlite3 и fs (нет, вам не нужно устанавливать этот файл. Он поставляется с NodeJS).

Шаг 3, Настройте соединение с базой данных в памяти, например:

let db = new sqlite3.Database('mydatabase', (err) => {
   if (err){
       return console.error(err.message);
   }
   console.log('Connected to the in-memory SQlite database.');
});

Закрыть соединение, вот так:

db.close((err) => {
  if (err) {
    return console.error(err.message);
  }
  console.log('Closed the database connection.');
});

Шаг 4, запустите файл через node db.js или что-то еще, чтобы убедиться, что настройка действительно работает.

Шаг 5. Прочтите и проанализируйте запросы SQL в виде строки в файле JS с помощью fs, например:

const dataSql = fs.readFileSync('./data.sql').toString();

На данный момент все 195 369 строк SQL-запросов были доступны мне в переменнойdataSql.

Вот как я их все собрал:

// Require or import the dependencies
const fs = require('fs');
const sqlite3 = require('sqlite3').verbose();

// Read the SQL file
const dataSql = fs.readFileSync('./data.sql').toString();

// Setup the database connection
let db = new sqlite3.Database('mydatabase', (err) => {
  if (err) {
    return console.error(err.message);
  }
  console.log('Connected to the in-memory SQLite database.');
});

// Convert the SQL string to array so that you can run them one at a time.
// You can split the strings using the query delimiter i.e. `;` in // my case I used `);` because some data in the queries had `;`.
const dataArr = dataSql.toString().split(');');

// db.serialize ensures that your queries are one after the other depending on which one came first in your `dataArr`
db.serialize(() => {
  // db.run runs your SQL query against the DB
  db.run('PRAGMA foreign_keys=OFF;');
  db.run('BEGIN TRANSACTION;');
  // Loop through the `dataArr` and db.run each query
  dataArr.forEach((query) => {
    if(query) {
      // Add the delimiter back to each query before you run them
      // In my case the it was `);`
      query += ');';
      db.run(query, (err) => {
         if(err) throw err;
      });
    }
  });
  db.run('COMMIT;');
});

// Close the DB connection
db.close((err) => {
  if (err) {
    return console.error(err.message);
  }
  console.log('Closed the database connection.');
});

Если вам трудно читать приведенный выше код, вот вам Github-суть.

Ага. Вот и все! При запуске node index.js запросы выполнялись, и все, что мне было нужно, загружалось в мою базу данных SQLite.

Если у вас есть вопросы или предложения, оставьте мне комментарий ниже. Если вы нашли эту статью интересной, не забудьте поддержать меня;)

Спасибо за внимание!

Благодарность: я нашел этот веб-сайт очень полезным https://www.sqlitetutorial.net/sqlite-nodejs/. Проверить это.