PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Prática recomendada para criar consultas SQL SELECT ao manipular valores indefinidos em potencial


Este problema é o mesmo que foi registrado aqui:https://github.com /vitaly-t/pg-promise/issues/442

Basicamente, pg-promise mecanismo de formatação de consulta gera SQL de acordo com seus parâmetros de formatação. Ele NÃO faz nenhuma verificação de sintaxe no SQL resultante.

Você está gerando IN () , que é SQL inválido, então você recebe o erro.

Você deve verificar a presença da variável, e nem mesmo tentar gerar tal consulta quando a variável estiver faltando, porque sua consulta não seria capaz de produzir nada de bom então.

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

Pode haver outras soluções, como pg-promise é muito genérico, não limita a maneira como você aborda isso.

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

você consegue fazer isso:
v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';

que produzirá o mesmo resultado. O que você gosta!;)