gpt4 book ai didi

javascript - Node : managing SQL files with variable replacement

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:40 26 4
gpt4 key购买 nike

我有大量的 SQL 语句,我想将它们存储为单独的文件(带有语法突出显示等)。我喜欢所提出的已接受的解决方案 here

在我的用例中,我使用 Javascript 模板文字语法编写 SQL 来进行变量替换。所以我的文件看起来像

-- some_file.sql
select col1, col2, col3
from my_table
where col1 = '${val1}'
and col2 between ${val2} and ${val3}

事实上,在查询增长并需要自己的文件之前,这种编写查询的方式最初是从使用模板文字开始的。

问题是如何实现模板文字,例如使用 fs.readFileSync 读取查询字符串的评估,而不必执行可怕的 eval?我调查了es6-template-render ,但是该实现不适合执行上下文中的变量;即不指定单独的 context 参数,而是隐式使用运行时环境中可用的变量(全局/本地)。

有什么指点吗?

最佳答案

如果我的假设不正确,我深表歉意,但 '${val1}' 周围的引号表明您计划使用字符串替换而不是参数化查询。 不要这样做。:-) 切勿使用字符串替换将值放入 SQL 查询中。让我向您介绍my friend Bobby :

enter image description here

改用参数化查询。

例如,您可以使用与现有的格式非常相似的格式,只是在 ${val1} 周围没有任何引号:

select col1, col2, col3
from my_table
where col1 = ${val1}
and col2 between ${val2} and ${val3}

然后您的代码可以将其转换为适合您的数据库 API 的查询。其中许多使用 ? 占位符,例如(这里我使用 node-mysql2 作为 DB API,但具体 API 不是重点):

const rexParam = /(?<!\$)\$\{([^}]+)\}/g;
function doQuery(sql, params) {
return new Promise((resolve, reject) => {
const values = [];
const preppedSql = sql.replace(rexParam, (_, paramName) => {
const value = params[paramName];
if (value === undefined) { // Or do an `in` check if you want to allow `undefined`
throw new Error(`Missing parameter ${paramName}`);
}
values.push(value);
return "?";
});
return connection.execute(
preppedSql,
values,
function(err, results, fields) {
if (err) {
reject(err);
} else {
resolve({results, fields});
}
}
);
});
}

它会遍历字符串,用 ? 替换 ${val1} 和此类标记,同时填充值数组以传递给参数化查询功能。

(请注意负向后查找,以便 $${...} 不会展开,就像在模板文字中一样。正则表达式有点原始,但对于我要的 SQL 来说应该足够了认为...)

仅转储字符串和值的实时示例:

const sql =
"select col1, col2, col3\n" +
"from my_table\n" +
"where col1 = ${val1}\n" +
"and col2 between ${val2} and ${val3}";

const rexParam = /(?<!\$)\$\{([^}]+)\}/g;
function doQuery(sql, params) {
const values = [];
const preppedSql = sql.replace(rexParam, (_, paramName) => {
const value = params[paramName];
if (value === undefined) { // Or do an `in` check if you want to allow `undefined`
throw new Error(`Missing parameter '${paramName}'`);
}
values.push(value);
return "?";
});
console.log(preppedSql);
console.log(values);
}

doQuery(sql, {val1: "one", val2: 2, val3: 20});

关于javascript - Node : managing SQL files with variable replacement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59429445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com