IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[DB-API]Recuperer la requete qui va etre executée ?


Sujet :

Python

  1. #1
    Membre extrêmement actif
    Avatar de kedare
    Homme Profil pro
    SRE
    Inscrit en
    Juillet 2005
    Messages
    1 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : SRE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 549
    Par défaut [DB-API]Recuperer la requete qui va etre executée ?
    Salut,
    j'ai un petit probleme mon programme utilise psycopg2, et j'ai créer une interface comme ceci, je voudrais pouvoir voir les requetes brutes, j'ai donc fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    # -*- coding: iso-8859-1 -*-
    import psycopg2 as pg
    import os
     
    class DBHandler(object):
     
    	def __init__(self,db_name):
    		self.db_name = db_name
    		self.database = pg.connect(db_name)
     
    	def cursor(self):
    		print("[DB]CURSOR CREATED")
    		return self.database.cursor()
     
    	def commit(self):
    		print("[DB]COMMIT")
    		return self.database.commit()
     
    	def rollback(self):
    		print("[DB]ROLLBACK")
    		return self.database.rollback()
     
    	def query_one(self,sql,arg=()):
    		print("[DB.QUERY_ONE]%s" %(sql))
    		cur = self.cursor()
    		cur.execute(sql,arg)
    		return cur.fetchone()
     
    	def query_all(self,sql,arg=()):
    		print("[DB.QUERY_ALL]%s" %(sql))
    		cur = self.cursor()
    		cur.execute(sql,arg)
    		return cur.fetchall()
     
    	def query(self,sql,arg=()):
    		print("[DB.QUERY]%s" %(sql))
    		cur = self.cursor()
    		cur.execute(sql,arg)
    		return 0
     
    	def query_many(self,sql,arg=(),limit=100):
    		print("[DB.QUERY_MANY]%s" %(sql))
    		cur = self.cursor()
    		cur.execute(sql,arg)
    		return cur.fetchmany(limit)
    Seulement les arguments ne sont pas affiché, ca fait que je n'ai que des logs de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO messages(content,post_date,user_id,channel_id) VALUES(%s,NOW(),%s,%s);
    les méthodes sont appelé comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            self.db_handler.query("""
            INSERT INTO messages(content,post_date,user_id,channel_id) VALUES(%s,NOW(),%s,%s);
            """,(unicode(message,"utf-8","ignore"),user_id,chan_id,))
    comment faire pour récupérer la requête finale ? je voudrais voir la "vrais requete", dans les caractères de substitution.

    Voila j'espere que vous pourrez m'aider,
    Merci

  2. #2
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Il faut utiliser les valeurs qui sont passés dans arg et avec l'opérateur %, mettre en forme le contenu de la variable sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def query(sql, arg=()):
        str = sql % arg
        print str
    
    
    message = "coucou"
    user_id = 12
    chan_id = 23
    
    query("""
    INSERT INTO messages(content,post_date,user_id,channel_id) VALUES(%s,NOW(),%s,%s);
    """,(unicode(message,"utf-8","ignore"),user_id,chan_id,))

  3. #3
    Membre extrêmement actif
    Avatar de kedare
    Homme Profil pro
    SRE
    Inscrit en
    Juillet 2005
    Messages
    1 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : SRE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 549
    Par défaut
    ca ne marche pas comme ca :p
    DB-API utilise pas les mêmes "%s" que les str, par exemple ca va ajouter '' si c'est un str, et échapper les caractères spéciaux... donc au final ton code me donne de fausse requêtes ;d

    j'ai demandé sur #python, et c'est impossible de faire ce que je veut si j'ai bien comprit... tant pis

    en gros je voulais la requete tel qu'elle est envoyé a la bdd pour du logging

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 16
    Par défaut
    étant donné que tu utilise des requêtes avec paramètre, le seul moyen que tu aies c'est d'imprimer les requêtes et les paramètres séparément en faisant
    un

Discussions similaires

  1. [ADO] Requete qui ne s'execute pas dans une transaction
    Par Faboul dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/07/2007, 13h30
  2. Réponses: 1
    Dernier message: 03/05/2007, 11h21
  3. requete qui recupere tout
    Par tiger63 dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/05/2007, 14h14
  4. Réponses: 3
    Dernier message: 11/05/2006, 17h30
  5. [VB6] recuperer une requete qui renvoie du xml
    Par voyageur dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/12/2004, 10h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo