#mysql #node.js
#mysql #node.js
Вопрос:
Я некоторое время работаю с MySQL, а также создал API в NodeJS, включая MySQL для работы
В принципе, мне нужен запрос типа «ВЫБРАТЬ * ИЗ таблицы, ГДЕ FieldA = varA И / ИЛИ FieldB = valB»
Я использую «mysql.format (sql, args)» для форматирования моего запроса, поэтому я использую? и ?? в моих запросах.
Я хотел бы написать базовый запрос, который я мог бы использовать и вводить все необходимые поля и значения
Я пробовал следующие способы
-> «ВЫБРАТЬ * ИЗ таблицы WHERE?» с «{FieldA: varA, FieldB: varB}» в качестве замены для ?
это приводит к «ВЫБРАТЬ * ИЗ таблицы, ГДЕ fieldA
= ‘varA’, fieldB
=’varB'»
-> «ВЫБРАТЬ * ИЗ таблицы, ГДЕ ?? = ?» с «[‘FieldA’, ‘FieldB’]» и «[‘varA’, ‘varB’]» в качестве замен
что приводит к «ВЫБРАТЬ * ИЗ таблицы, ГДЕ fieldA
, fieldB
= ‘varA’, ‘varB'»
На данный момент мне «нужны только» 2 разных поля, поэтому я мог бы добавить фиксированные «FieldA =? И / ИЛИ FieldB =?» и заполнить только значения. Но я хотел бы использовать динамический способ и указать все поля, которые мне могут понадобиться в нем, а также, если я использую AND или OR при объединении.
Я не нашел ничего подобного в документации, может быть, кто-то здесь наткнулся раньше. Или это может быть единственным решением для динамического добавления некоторых «И / ИЛИ ?? = ?» к запросу и заполнению массива аргументов с помощью fieldName, значения одно за другим?
Комментарии:
1. почему бы вам сначала не создать динамическую строку запроса и не выполнить ее?
2. поскольку я использую функцию mysql.format(sql, arg) фреймворка mysql, она использует? для замены значений или?? для замены имен полей / имен таблиц. Также он автоматически экранирует все, что в нем содержится.
Ответ №1:
Рассмотрим тезисы — это поля, которые вам нужны для построения строки динамического запроса.
var fields = [{fieldName:"A",value:"one",operator:"AND"},{fieldName:"B",value:"two",operator:""}];
Теперь попробуйте создать строку запроса с этим массивом. На данный момент я рассмотрел только два поля, но вы можете добавить их в соответствии с вашими потребностями.
var fields = [{fieldName:"A",value:"one",operator:"AND"},{fieldName:"B",value:"two",operator:""}];
var query = "SELECT * FROM table WHERE ";
fields.forEach((f)=>{
query=query `${f.fieldName} = ${f.value} `
if(f.operator!="") query=query f.operator " "
})
console.log(query)
Ответ №2:
Сейчас я создал метод для этого, используя подсказки из ответа Ameers. Он сгенерирует запрос типа
SELECT * FROM ?? WHERE ??=? AND/OR ??=? AND/OR ??=?
а затем добавит имя поля и значения в массив аргументов для mysql.format
var fieldValues = [
{ field: 'command', value: command.command, operator: 'OR' },
{ field: 'alias', value: command.command, operator: 'OR' }
];
exists(fieldValues) {
let query = 'SELECT * FROM ??';
let args = ['tablename'];
for (let i = 0; i < fieldValues.length; i ) {
let operator = i == 0 ? 'WHERE' : fieldValues[i].operator;
query = ` ${operator} ?? = ?`;
args.push(fieldValues[i].field);
args.push(fieldValues[i].value);
}
return mysql.query(query, args);
}
mysql.query()
вот моя оболочка mysql.connection.query
и использование обещаний
Возможно, есть лучший встроенный метод, но я его еще не нашел, и таким образом я все еще могу использовать встроенную функцию mysql-formatter.
Ответ №3:
Учтите, что у вас есть поля в БД, такие как first_name
, last_name
, personal_email,
work_email
и office_name
. и вы хотите получить все результаты, соответствующие полям поиска. т. Е. let search = req.query.search.
Это станет легко с ORM, например Objection.js Таким образом, запрос будет выглядеть следующим образом, используя objection.js
if (search) {
table_name.where('column_name.last_name', 'like', `%${search}%`)
.orWhere('column_name.first_name', 'like', `%${search}%`)
.orWhere('column_name.personal_email', 'like', `%${search}%`)
.orWhere('column_name.work_email', 'like', `%${search}%`)
.orWhere('column_name.office_name', 'like', `%${search}%`)
}
Примечание: этот код находится в nodejs, и вы также можете использовать table_name
, вы также можете добавить model_name
.