104 votes

node-postgres : comment exécuter la requête "WHERE col IN (<liste de valeurs dynamiques>)" ?

J'essaie d'exécuter une requête comme celle-ci :

SELECT * FROM table WHERE id IN (1,2,3,4)

Le problème est que la liste des identifiants sur lesquels je veux filtrer n'est pas constante et doit être différente à chaque exécution. J'aurais également besoin d'échapper les identifiants, car ils pourraient provenir de sources non fiables, bien que j'échappe en fait tout ce qui entre dans une requête, quelle que soit la fiabilité de la source.

node-postgres semble fonctionner exclusivement avec des paramètres liés : client.query('SELECT * FROM table WHERE id = $1', [ id ]) ; cela fonctionnera si j'avais un nombre connu de valeurs ( client.query('SELECT * FROM table WHERE id IN ($1, $2, $3)', [ id1, id2, id3 ]) ), mais ne fonctionnera pas directement avec un tableau : client.query('SELECT * FROM table WHERE id IN ($1)', [ arrayOfIds ]) car il ne semble pas y avoir de traitement spécial des paramètres de tableau.

Construire le modèle de requête dynamiquement en fonction du nombre d'éléments dans le tableau et étendre le tableau des identifiants dans le tableau des paramètres de la requête (qui dans mon cas actuel contient également d'autres paramètres en plus de la liste des identifiants) semble être une charge déraisonnable. Le codage en dur de la liste des identifiants dans le modèle de requête ne semble pas non plus viable, car node-postgres ne fournit aucune méthode d'échappement des valeurs.

Cela semble être un cas d'utilisation très commun, donc je pense que je suis en train de négliger quelque chose, et non pas qu'il n'est pas possible d'utiliser la méthode commune de l IN (values) Opérateur SQL avec node-postgres.

Si quelqu'un a résolu ce problème d'une manière plus élégante que celles que j'ai énumérées ci-dessus, ou si je rate vraiment quelque chose à propos de node-postgres, veuillez m'aider.

0voto

C. Marca Points 23

Une autre solution possible est par exemple une API REST en NODE JS :

var name = req.body;//Body is a objetc that has properties for example provinces
var databaseRB = "DATABASENAME"
var conStringRB = "postgres://"+username+":"+password+"@"+host+"/"+databaseRB; 

var filter_query = "SELECT row_to_json(fc) FROM ( SELECT 'FeatureCollection' As type, array_to_json(array_agg(f)) As features FROM (SELECT 'Feature' As type, ST_AsGeoJSON(lg.geom)::json As geometry, row_to_json((parameters) As properties FROM radiobases As lg WHERE lg.parameter= ANY($1) )As f) As fc";

var client = new pg.Client(conStringRB);
client.connect();
var query = client.query(new Query(filter_query,[name.provinces]));
query.on("row", function (row, result) {
  result.addRow(row);
});
query.on("end", function (result) {
 var data = result.rows[0].row_to_json
   res.json({
     title: "Express API",
     jsonData: data
     });
});

Gardez à l'esprit que tout type de tableau peut être utilisé

-1voto

ALMEK Points 85

L'idée générale :

var invals = [1,2,3,4], cols = [...fields];
var setvs = vs => vs.map(v=> '$'+ (values.push(v))  ).join();

var values = [];
var text = 'SELECT '+ setvs(cols) +' FROM table WHERE id IN (' + setvs(invals) +')';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X