Модуль для работы с sqlite3

от автора

Сегодня Я хотел бы поделиться своей не большой разработкой, которая помогает мне уже более чем пол года: «Модуль для работы с sqlite3».

Концепция

Вместо написания SQL запросов мы будем передавать ключи, значения, названия таблиц, условия и callback’и, которые будут вызывать по завершению запросов(в каждый callback мы будем передавать ошибку и результат, если такой есть).

Представим модуль в виде класса.

Всего будет 4 метода:

  1. getData() — для получения данных из таблицы.

  2. insertData() — для добавления данных в таблицу.

  3. updateData() — для обновления данных в таблице.

  4. deleteData() — для удаления данных из таблицы.

Конечно же с помощью 4 методов приведенных выше мы не сможем исключить все виды запросов, но в моем случаи эти запросы самые частые.

Кодим

Для начало создадим сам класс, настроем экспорт и подключимся к БД и создадим метод, который будет добавлять кавычки у элемента, если тип элемента соответствует типу строки.

class DataBase {      /**      *       * @readonly      */     static sqlite3 = require('sqlite3').verbose();          /**     *      * @readonly     */    static database = new this.sqlite3.Database('./database/database.db');      static ToString(value) {         return typeof(value) === 'string' ? '\'' + value + '\'' : value;     } }  module.exports = {     database: DataBase };

Для начало напишем метод, который будет возвращать данные из таблицы, не обязательно, но мы будем учитывать, кол-во строк, которые нам будут возвращаться(одна или несколько).

Начинаем собирать запрос с ключевого слова «SELECT», далее перебираем все столбцы, которые нам передали и добавляем их, но не забываем, что символ «*» не нужно «заковывать» в кавычки, т к этот символ говорит нам, что нужно получить все столбцы. Заканчиваем собор указанием таблицы и условия. Далее, исходя из кол-во строк, которые нам надо вернуть вызываем соответствующий метод.

class DataBase {      /**      *       * @readonly      */     static sqlite3 = require('sqlite3').verbose();          /**     *      * @readonly     */    static database = new this.sqlite3.Database('./database/database.db');          /**      *       * @param {String[]} keys       * @param {String} table       * @param {String} condition       * @param {Boolean} some       * @param {Function()} callback       */     static getData(keys, table, condition = '', some = true, callback = () => {}) {         let sql = 'SELECT ';         for (let i = 0; i < keys.length; i++) {             sql += keys[i] === '*' ? keys[i] : '`' + keys[i] + '`';             if (keys.length > i + 1)                 sql += ', ';         }         sql += ' FROM `' + table + '` ' + condition;                  if (some)             this.database.all(sql, (err, rows) => {                 callback(err, rows);             });         else             this.database.get(sql, (err, row) => {                 callback(err, row);             });     };      static ToString(value) {         return typeof(value) === 'string' ? '\'' + value + '\'' : value;     } }  module.exports = {     database: DataBase };

Напишем метод отвечающий за обновление данных.

Начинаем с указания таблицы, установкой ключей и значений, а завершаем добавлением условия.

class DataBase {      /**      *       * @readonly      */     static sqlite3 = require('sqlite3').verbose();          /**     *      * @readonly     */    static database = new this.sqlite3.Database('./database/database.db');          /**      *       * @param {String[]} keys       * @param {String} table       * @param {String} condition       * @param {Boolean} some       * @param {Function()} callback       */     static getData(keys, table, condition = '', some = true, callback = () => {}) {         let sql = 'SELECT ';         for (let i = 0; i < keys.length; i++) {             sql += keys[i] === '*' ? keys[i] : '`' + keys[i] + '`';             if (keys.length > i + 1)                 sql += ', ';         }         sql += ' FROM `' + table + '` ' + condition;                  if (some)             this.database.all(sql, (err, rows) => {                 callback(err, rows);             });         else             this.database.get(sql, (err, row) => {                 callback(err, row);             });     };          /**      *       * @param {String[]} keys       * @param {Values[]} values       * @param {String} table       * @param {String} condition       * @param {Function()} callback       */     static updateData(keys, values, table, condition, callback = () => {}) {         let sql = 'UPDATE `' + table + '` SET ';         for (let i = 0; i < keys.length; i++) {             sql += '`' + keys[i] + '` = ' + this.ToString(values[i]);             if (keys.length > i + 1)                 sql += ', ';         }         sql += ' ' + condition;                  this.database.run(sql, (err) => {             callback(err);         });     }      static ToString(value) {         return typeof(value) === 'string' ? '\'' + value + '\'' : value;     } }  module.exports = {     database: DataBase };

Остается совсем чуть-чуть, напишем метод для удаления данных(она максимально простой) и метод для добавления данных.

Добавления данных начнем с указания таблицы, потом передадим все ключи, которые мы хотим установить и заканчиваем установкой всех значений(значение должно иметь такой же индекс как и ключ, которому необходимо установить это значение).

class DataBase {      /**      *       * @readonly      */     static sqlite3 = require('sqlite3').verbose();          /**     *      * @readonly     */    static database = new this.sqlite3.Database('./database/database.db');          /**      *       * @param {String[]} keys       * @param {String} table       * @param {String} condition       * @param {Boolean} some       * @param {Function()} callback       */     static getData(keys, table, condition = '', some = true, callback = () => {}) {         let sql = 'SELECT ';         for (let i = 0; i < keys.length; i++) {             sql += keys[i] === '*' ? keys[i] : '`' + keys[i] + '`';             if (keys.length > i + 1)                 sql += ', ';         }         sql += ' FROM `' + table + '` ' + condition;                  if (some)             this.database.all(sql, (err, rows) => {                 callback(err, rows);             });         else             this.database.get(sql, (err, row) => {                 callback(err, row);             });     };          /**      *       * @param {String[]} keys       * @param {Values[]} values       * @param {String} table       * @param {String} condition       * @param {Function()} callback       */     static updateData(keys, values, table, condition, callback = () => {}) {         let sql = 'UPDATE `' + table + '` SET ';         for (let i = 0; i < keys.length; i++) {             sql += '`' + keys[i] + '` = ' + this.ToString(values[i]);             if (keys.length > i + 1)                 sql += ', ';         }         sql += ' ' + condition;                  this.database.run(sql, (err) => {             callback(err);         });     }          /**      * @param {String[]} keys      * @param {String[]} values      * @param {String} table       * @param {Function()} callback       */     static insertData(keys, values, table, callback = () => {}) {         let sql = 'INSERT INTO `' + table + '` (';         for (let i = 0; i < keys.length; i++) {             sql += '`' + keys[i] + '`';             if (keys.length > i + 1)                 sql += ', ';         }         sql += ') VALUES (';         for (let i = 0; i < values.length; i++) {             sql += this.ToString(values[i]);             if (values.length > i + 1)                 sql += ', ';         }         sql += ')';          this.database.run(sql, (err) => {             callback(err);         });     };      /**      *       * @param {String} table       * @param {String} condition       * @param {Function()} callback       */     static deleteData(table, condition = '', callback = () => {}) {         this.database.run('DELETE FROM `' + table + '` ' + condition, (err) => {             callback(err);         });     }      static ToString(value) {         return typeof(value) === 'string' ? '\'' + value + '\'' : value;     } }  module.exports = {     database: DataBase };

На этом все, спасибо за внимание!
Проект на GitHub

ссылка на оригинал статьи https://habr.com/ru/post/556314/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *