PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Best Practice für das Erstellen von SQL SELECT-Abfragen beim Umgang mit potenziell undefinierten Werten

Dieses Problem ist das gleiche, das hier protokolliert wurde:https://github.com /vitaly-t/pg-promise/issues/442

Grundsätzlich pg-promise Die Abfrageformatierungs-Engine generiert SQL gemäß Ihren Formatierungsparametern. Es führt KEINE Syntaxprüfung an Ihrem resultierenden SQL durch.

Sie generieren IN () , was ungültiges SQL ist, daher erhalten Sie den Fehler.

Sie sollten prüfen, ob die Variable vorhanden ist, und nicht einmal versuchen, eine solche Abfrage zu generieren, wenn die Variable fehlt, da Ihre Abfrage dann nichts Gutes liefern könnte.

Beispiel:

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

Es kann andere Lösungen geben, wie pg-promise ist sehr generisch, es schränkt Sie in Ihrer Herangehensweise nicht ein.

Zum Beispiel stattdessen:

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

Sie können dies tun:

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

was zum selben Ergebnis führt. Was immer Sie mögen!;)