7
votes

Node-Postgres: Comment préparer une déclaration sans exécuter la requête?

Je souhaite créer une "déclaration préparée" dans Postgres à l'aide du module Node-Postgres. Je veux le créer sans le lier aux paramètres car la liaison aura lieu dans une boucle.

dans le Documentation I LIRE: P>

client.query({"name":"mystatement", "text":"select id from mytable where id=$1"});


0 commentaires

3 Réponses :


1
votes

Mise à jour: lire votre question à nouveau, voici ce que je crois que vous devez faire. Vous devez également passer une table "valeur".

juste pour clarifier; Lorsque vous «prépareriez» votre requête normalement, préparez simplement l'objet que vous y passez, sans la matrice de valeur. Ensuite, où vous seriez normalement "exécuter" votre requête, définissez la matrice de valeur dans l'objet et transmettez-la à la requête. Si c'est la première fois, le pilote fera la préparation réelle pour vous la première fois et simplifiera la liaison et l'exécution pour le reste de l'itération.


2 commentaires

Le problème avec cette solution est que la déclaration préparée sera exécutée avec les valeurs «quelles que soient les valeurs» utilisées au moment de la création. Il se sent également akward d'utiliser la première itération de la boucle pour la création


C'est ainsi que l'API est conçue, je suppose, du moins c'est ce que j'ai eu de lire les documents et de l'utiliser dans l'un de mes propres projets. L'API s'attend à ce que vous créiez votre objet de requête lorsque vous devez l'utiliser, puis il devra déterminer si elle doit préparer une déclaration ou non si elle sait que tout ce que vous mettez dans texte déjà .



15
votes

Je viens de trouver un Réponse sur ce numéro par l'auteur de Node-Postgres.

avec nœud-postgres la première fois que vous publiez une requête nommée, c'est analysé, lié et exécuté tout à la fois. Chaque requête ultérieure émise sur la même connexion avec le même nom saura automatiquement le "Parse" étape et ne reculerait et n'exécute que la requête déjà planifiée.

Actuellement, Node-Postgres ne prend pas en charge un moyen de créer un nommé, Requête préparée et ne pas exécuter la requête. Cette fonctionnalité est prise en charge dans la libpq et le protocole client / serveur (utilisé par la pure liaisons javascript), mais je ne l'ai pas directement exposée dans l'API. je pensait que cela ajouterait une complexité à l'API sans aucun avantage réel. Puisque les déclarations nommées sont liées au client dans lequel ils sont créé, si le client est déconnecté et reconnecté ou différent Le client est renvoyé du pool client, la déclaration nommée NO travail plus long (il nécessite une ré-analyse).


0 commentaires

2
votes

Vous pouvez utiliser PG-préparé pour cela:

var prep = require('pg-prepared')

// First prepare statement without binding parameters
var item = prep('select id from mytable where id=${id}')

// Then execute the query and bind parameters in loop
for (i in [1,2,3]) {
  client.query(item({id: i}), function(err, result) {...})
}


3 commentaires

PG-Préparé fait quelque chose de différent de ce que peut demander. Il offre la possibilité d'utiliser des espaces réservés nommés dans les requêtes.


OP souhaite créer des énoncés préparés sans valeurs de paramètre contraignant sur la création. C'est ce qui se passe sur l'exemple avec PG-préparé. Tout d'abord, vous créez la déclaration sans contraider les valeurs de paramètre et stockez-la dans l'élément Var. Ensuite, vous l'appelez avec les paramètres. SO OP peut l'utiliser en créant la reliure sans variables de liaison, puis l'appelez avec les valeurs de paramètre dans la boucle.


Dans votre cas, la base de données doit préparer la requête encore et encore. Que veut que OP veut soulager la DB en préparant la STMT une seule fois. Accouchement à la réponse acceptée, PG-préparé pourrait atteindre cet objectif si elle donnait un attribut unique "Nom" à la requête - CF GITUB.COM/BRIANC/NODE-POSTGRES/WIKI/PREPETED-STIENS