PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Meilleure pratique pour créer des requêtes SQL SELECT tout en gérant des valeurs indéfinies potentielles

Ce problème est le même que celui enregistré ici :https://github.com /vitaly-t/pg-promise/issues/442

Fondamentalement, pg-promise Le moteur de formatage des requêtes génère du SQL en fonction de vos paramètres de formatage. Il ne fait PAS de vérification de syntaxe sur votre SQL résultant.

Vous générez IN () , qui est un SQL non valide, vous obtenez donc l'erreur.

Vous devriez vérifier la présence de la variable, et même ne pas essayer de générer une telle requête lorsque la variable est manquante, car votre requête ne pourrait alors rien donner de bon.

Exemple :

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

Il peut y avoir d'autres solutions, comme pg-promise est très générique, cela ne vous limite pas dans votre approche.

Par exemple, au lieu de ceci :

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

vous pouvez faire ceci :

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

qui produira le même résultat. Celui que vous aimiez !;)