PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Най-добра практика за създаване на SQL SELECT заявки при обработка на потенциални недефинирани стойности

Този проблем е същият като регистрирания тук:https://github.com /vitaly-t/pg-promise/issues/442

По принцип pg-promise машината за форматиране на заявки генерира SQL според вашите параметри за форматиране. Той НЕ прави никаква проверка на синтаксиса на получения ви SQL.

Вие генерирате IN () , което е невалиден SQL, така че получавате грешката.

Трябва да проверите за наличието на променливата и дори да не се опитвате да генерирате такава заявка, когато променливата липсва, защото заявката ви няма да може да даде нищо добро тогава.

Пример:

router.get('/search', (req, res, next) => {
    const variables = ['variable_a', 'variable_b', 'variable_c'];
    const conditions = variables.filter(v => v in req.query)
        .map(v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]]))
        .join(' AND ');

    conditions = conditions && 'WHERE ' + conditions;

    db.any('SELECT * FROM food $1:raw', conditions)
        .then(result => res.send(result))
        .catch(error => {/* handle the error */});
});

Може да има и други решения, като pg-promise е много общ, не ви ограничава в начина, по който подхождате към това.

Например вместо това:

v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])

можете да направите това:

v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';

което ще доведе до същия резултат. Което ви харесва!;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ruby миграцията е върната, но получава грешка при повторно стартиране на миграцията

  2. SQLAlchemy create_all() не създава таблици

  3. Rails 3 Query:получаване на грешка при използване на 'select' с 'order'

  4. Кортеж към списък - тип връщане на Python / PostgreSQL на запис SETOF

  5. Как да превключите булева стойност в postgres в една заявка