#javascript #string #interpolation
Вопрос:
Я пытаюсь подготовить некоторый SQL-запрос для Amazon Athena с динамическими условиями » ГДЕ » в JavaScript. Запрос был сохранен для одной переменной в другом файле. Как добавить в него пользовательское условие WHERE?
Псевдокод, которого я пытаюсь достичь,
file1.js
module.exports.queryFromFile1 = 'SELECT * Name FROM Contact WHERE Name = ?';
file2.js
const {queryFromFile1} = require('./file1.js');
const newQuery = queryFromFile1,['Jane'];
console.log(newQuery); // 'SELECT * Name FROM Contact WHERE Name = 'Jane'
Может ли кто-нибудь предложить мне правильный метод для этого? мое текущее решение опубликовано ниже.
file1.js
module.exports.queryFromFile1 = 'SELECT * Name FROM Contact WHERE Name = {stringToReplace}';
file2.js
const {queryFromFile1} = require('./file1.js');
const newQuery = queryFromFile1.replace("{stringToReplace}", "'Jane");
console.log(newQuery); // 'SELECT * Name FROM Contact WHERE Name = 'Jane'
Комментарии:
1. Пожалуйста, просто используйте подготовленные заявления. Нет необходимости открывать себя для SQL-инъекции , делая это вручную
2. @VLAZ Спасибо за комментарий. не могли бы вы подробнее рассказать о подготовленных заявлениях. запрос, который я готовлю, предназначен не для MYSQL/MSSQL, а для amazon Athena.
3.
db.execute(queryFromFile1, ['Jane'])
4. привет, @LawrenceCherone, я пытаюсь выполнить этот запрос к Amazon Athena , поэтому упомянутый метод для меня не работает.
5. Я думаю, ты имел в виду
SELECT * FROM Contact
?
Ответ №1:
Я использую небольшую вспомогательную функцию, которая позволяет вам использовать прямую интерполяцию строк es6 окольным путем:
const template= (template, ctx) => {
const script = new vm.Script('`' template '`')
return script.runInNewContext(ctx)
}
const results = template('hello ${foo}', {foo:'jane'})
Но, если вам просто нужно выполнить простую интерполяцию, почему бы просто не экспортировать sql как функцию?
const queryFromFile1 = str => (`SELECT * Name FROM Contact WHERE Name = ${str}`)
const query = queryFromFile1('Jane')
Ответ №2:
Как упоминалось в комментариях, вы не должны обрабатывать операторы SQL с необработанными строками.
Однако для не критичных для безопасности частей вашего кода (например, для ввода строки формата даты из реквизитов компонентов) я предпочитаю делать это именно так:
const stringProducer = (insert) => `This was inserted: ${insert}`;
Затем используйте вот так:
const string = stringProducer("foo");