В этом посте я покажу, как мне удалось заставить мое приложение 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/. Проверить это.