【发布时间】: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