Как исправить два запроса Knex MySQL, зависящих друг от друга в router.get - PullRequest
2 голосов
/ 01 июня 2019

Я пытаюсь отобразить данные из двух таблиц базы данных на маршруте, используя Node, Express и JavaScript. Я новичок в JavaScript, и особенно новичок в Node и Express. Я подключил свое приложение Express к базе данных с помощью knex и пытаюсь использовать запросы MySQL SELECT для извлечения данных из двух таблиц для отображения на сервере.

Данные в атрибуте / столбце 'column' в таблице 'offence_columns' отображаются в виде столбца в таблице 'нарушений', поэтому у меня есть два обещания, одно из которых получает данные из атрибута 'column' в таблица offence_columns и другая, в которой выбирается атрибут «площадь» в таблице «преступления», а другой атрибут / столбец - это то, что было выбрано из атрибута «столбцы».

Так как «столбец» является зарезервированным словом в MySQL, у меня были некоторые проблемы с его выбором. Использование одинарных кавычек, как в приведенном коде, дает мне код в терминале:

Необработанный отказ. Ошибка: ER_PARSE_ERROR: в синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом со значением «как 0 из offences» в строке 1.

Я получаю ту же ошибку, если подставляю одинарные кавычки для обратных тиков (column), но если я пытаюсь использовать оба ('column'), я получаю другую ошибку:

Ошибка: ER_BAD_FIELD_ERROR: неизвестный столбец 'column' в 'списке полей'.

Я пытался использовать псевдонимы, но, похоже, это не помогло.

router.get('/api/search/:offence', function(req, res, next) {
  req.db.from('offence_columns').select('column').where('pretty',"=",req.params.offence)
    .then((rows) => {
      req.db.from('offences').select('area', rows)
        .then((rows2) => {
          res.json({"Error" : false, "Message" : "Success", "City" : rows2})
        })
    })
    .catch((err) => {
      console.log(err);
      res.json({"Error" : true, "Message" : "Error in MySQL query"})
    })
});

1 Ответ

1 голос
/ 02 июня 2019

Прежде всего, подумайте о настройке вашей схемы.column - это действительно ужасное имя для столбца базы данных ... как вы уже обнаружили, это вызовет всевозможные недоразумения!

Однако Knex обычно выводит имена с обратными галочками в выводе, что следует избегатьзарезервированное слово вопроса.Это на самом деле не ваша проблема.То, что вы видите, является результатом попытки выполнить запрос с массивом в нем:

req.db.from('offences').select('area', rows)

Здесь rows - это массив, который может быть или не быть пустым.Это результат предыдущего запроса.

Я подозреваю, что вы ищете что-то более похожее (догадываюсь, потому что я не знаю, какова ваша схема):

db.from("offence_columns")
  .select("column")
  .where("pretty", "=", req.params.offence)
  .then(rows => {
    if (rows.length === 0) {
      res.json({ error: false, message: "No cities matched." });
    }

    req.db
      .from("offences")
      // This assumes that `offence_columns` has an `area` column
      .where("area", "=", rows[0].area)
      .then(areas => {
        res.json({ Error: false, Message: "Success", city: areas[0] });
      });
  });

Здесь все еще есть ряд проблем.С одной стороны, что если любой запрос может вернуть более одного результата?Кроме того, вам, вероятно, лучше использовать объединение в первую очередь:

db
  .select('city')
  .from('offence_columns')
  .join('offences', 'offence_columns.area', '=', 'offences.area')
  .where('pretty', '=', req.params.offence)

Однако, это все догадки, не зная, как выглядит ваша схема.

...