PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Najlepsze praktyki tworzenia zapytań SQL SELECT podczas obsługi potencjalnych niezdefiniowanych wartości

Ten problem jest taki sam, jak został zarejestrowany tutaj:https://github.com /vitaly-t/pg-promise/issues/442

Zasadniczo pg-promise aparat formatowania zapytań generuje kod SQL zgodnie z parametrami formatowania. NIE wykonuje żadnej weryfikacji składni na wynikowym SQL.

Generujesz IN () , który jest nieprawidłowym kodem SQL, więc pojawia się błąd.

Powinieneś sprawdzić obecność zmiennej, a nawet nie próbować generować takiego zapytania, gdy brakuje zmiennej, ponieważ twoje zapytanie nie dałoby wtedy niczego dobrego.

Przykład:

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 */});
});

Mogą istnieć inne rozwiązania, jak pg-promise jest bardzo ogólny, nie ogranicza sposobu, w jaki do tego podchodzisz.

Na przykład zamiast tego:

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

możesz to zrobić:

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

co przyniesie ten sam wynik. Cokolwiek chcesz!;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gem install pg nie może powiązać z libpq

  2. Jak połączyć się z localhost za pomocą postgres_fdw?

  3. Statystyki zasięgu kodu

  4. Railsy 3.1:Odpytywanie Postgresa o rekordy w przedziale czasowym

  5. PostgreSQL Bigserial &nextval