【问题标题】:Javascript promise to iterate/include dynamic number of ArgumentsJavascript 承诺迭代/包含动态数量的参数
【发布时间】:2020-02-18 19:58:03
【问题描述】:

我正在使用 mssql npm 模块(带有繁琐的驱动程序)从我的节点服务器读取/写入 Azure Sql 数据库。 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 是一个相当常见的功能,并且可能有更好的方法来实现我在这里尝试做的事情。请随意走不同的路线。

附: - 虽然我应该说我更喜欢 mssql 而不是 Tedious 包。在过去几个小时浏览文档后,它的功能似乎更好。

【问题讨论】:

  • 执行此操作的库通常称为 ORM。 (例如sequelize.org)如果你搜索ORM Node.js,我希望你会找到你需要的。
  • 谢谢@Hogan。我知道这一定有什么东西,只是不知道去哪里找。我会研究 Sequalize 和类似的东西,并通过更新恢复。
  • 用现代语言编写自己的 ORM 也很容易——我用 C# 编写了一个适合 150 行的 ORM。我一直计划制作它的版本节点,但没有机会。如果您有兴趣将其用作模板,这里是开源代码:gist.github.com/hoganlong/b7f5c5e8dde61ae3cd6f
  • 谢谢@Hogan。我看了看,还不错。我看看下个月能不能再转回去。 (得到了让我在接下来的几周里忙碌的可交付成果。)

标签: node.js sql-server promise azure-sql-database tedious


【解决方案1】:

如果您想与您的数据库交互而不自己创建所有查询,您可以使用像 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(我喜欢 Objection.js)会是一个不错的选择。

【讨论】:

  • 谢谢@Rashomon。这两个看起来是不错的选择。我会调查它们并通过更新恢复。
猜你喜欢
  • 2014-10-05
  • 2016-12-01
  • 2021-04-03
  • 2018-05-05
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多