タグ付けされたテンプレートを使用して、パラメーターを使用してクエリを作成しています。
function query (strings, ...args) {
return {
sql: strings.join('?'),
params: args
}
}
const storeId = '417-123';
const id = 10;
const res = query`select * from trad.customers where store_id = ${ storeId } and customer_id = ${ id }`;
// res.sql: select * from trad.customers where store_id = ? and customer_id = ?;
// res.params: [ '417-123', 10 ];
場合によっては、SQL パラメーターとして渡すことができない変数 (テーブル名など) をクエリに渡す必要があります。私はこれで立ち往生しています...
const nim = '0850204';
const id = 143;
const res = query`select * from _${ nim }_ tickets where tick_id = ${ id }`;
// what I get:
// res.sql: select * from _?_ tickets where tick_id = ?;
// res.params: [ '0850204', 143 ];
// what I'd like
// res.sql: select * from _0850204_ tickets where tick_id = ?;
// res.params: [ 143 ];
どうすればこれを回避できますか? ご協力ありがとうございました :)
EDIT :変数をいつ直接置換するかを示すフラグとして特別な文字を使用しました...このように、文字#
が見つかったら、次の値を直接置換します。もっとうまくやれると確信していますが、どうすればよいかわかりません...
function query (strings, ...args) {
const del = [];
const replace = [];
let sql = strings
.map((data, index) => {
if (data.endsWith('#') === false) return data;
replace.push(args[index]);
del.push(index);
return data;
})
.join('?');
args = args.filter((d, index) => del.includes(index) === false);
let n = 0;
while (sql.includes('#?')) {
sql = sql.replace('#?', replace[n]);
}
return { sql, params: args };
}
const nim = '0850204';
const id = 143;
// Notice the '#'
const res = query`select * from _#${ nim }_ tickets where tick_id = ${ id }`;
// res.sql: select * from _0850204_ tickets where tick_id = ?;
// res.params: [ 143 ];