Javascript обещают повторить / включить динамику c количество аргументов - PullRequest
0 голосов
/ 18 февраля 2020

Я использую модуль ms sql npm (с драйвером Tedious) для чтения / записи в базу данных Azure Sql с моего узла Server. https://www.npmjs.com/package/mssql

Все примеры, которые я нашел, представляют собой жестко закодированный пример запроса о том, читать или писать записи, например:

var insertRecordIntoTable = function (callback) {

  sql.connect(dbConfig).then(pool => {

     return pool.request()
        .input('ID', sql.Int, 210)
        .input('Name', sql.NVarChar, "John Doe")
        .input('EmailAddress', sql.NVarChar, "test@test.com")
        .query("INSERT INTO Accounts (ID, Name, EmailAddress) VALUES (@ID, @Name, @EmailAddress)")
  }).then(result => {
     console.dir(result)
     callback(result);
  }).catch(err => {
     // ... error checks
     console.log("Error occured: " + err);
     callback(err);
  });

}

Очевидно, Я хотел бы написать один стандартный метод для записи записей в любую таблицу в базе данных.

Теперь я могу получить структуру каждой таблицы и использовать ее, чтобы узнать, какой тип данных должен содержать каждое поле. быть от ключа в jsonRecord и написать что-то вроде этого:

var insertRecordIntoTable = function (jsonRecord, tableName, callback) {

  let arrKeys = jsonRecord.allKeys();
  let columnNames = getCommaSeparatedColumnNames(arrKeys); 
  let valuePlaceholders = getValuePlaceholdersForSql(arrKeys);

  sql.connect(dbConfig).then(pool => {

     return pool.request()

        // how do I write something like this so that dynamic number of fields and values get populated in the query inside this promise.
        // I'm open to methods without promise as well.

        for(let x=0; x < arrKeys.length; x++){

           let key = arrKeys[x];

           // .input('ID', sql.Int, 210)
           .input(key, getTypeForKey(key, tableName), jsonRecord[ key ] )

        }

        .query("INSERT INTO " + tableName + " (" + columnNames + ") VALUES (" + valuePlaceholders + ")")
  }).then(result => {
     console.dir(result)
     callback(result);
  }).catch(err => {
     // ... error checks
     console.log("Error occured: " + err);
     callback(err);
  });

}

function getTypeForKey(key){. // looks up table schema and returns keyType }

function getCommaSeparatedColumnNames(arrKeys){  return arrKeys.join(", "); }

function getValuePlaceholdersForSql(arrKeys){   // write code to append '@' before every key and then join using comma's and return that string }

Я уверен, что node.js запись в SQL - довольно распространенная функциональность, и могут быть более эффективные способы достижения того, что я пытаюсь сделать здесь. Пожалуйста, не стесняйтесь go другой маршрут.

PS - хотя я должен сказать, что я предпочитаю мс sql над утомительным пакетом. Похоже, функциональность кажется лучше после просмотра документации за последние несколько часов.

1 Ответ

1 голос
/ 19 февраля 2020

Если вы хотите взаимодействовать с вашей базой данных, не создавая все запросы самостоятельно, вы можете использовать конструктор запросов, например knex, для управления данными как объектами:

knex('Accounts').insert({ID: 210, Name: "John Doe", EmailAddress: "test@test.com"})

будет похоже на:

insert into `Accounts` (`EmailAddress`, `ID`, `Name`) values ('test@test.com', 210, 'John Doe')

Также я вижу, что вы проверяете типы. Если вам нужна валидация, возможно, хорошим вариантом будет полная ORM (мне нравится Возражение. js).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...