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 :

passage paramétre requete sql


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2003
    Messages : 37
    Points : 29
    Points
    29
    Par défaut passage paramétre requete sql
    Bonjour,

    pour les besoins d’un programme fait en python, je voudrais pouvoir faire une fonction générique pour exécuter mes requêtes SQL.

    Cette fonction doit être appelé avec le nom de la requête stocker dans une variable ainsi que de 1 à x paramètres.

    mais voila je bloque sur la création des requêtes pour tenir compte des paramètres supplémentaires.

    Pour que cela soit plus clair voici un bout de code que j’essaie de créer :


    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    import cx_Oracle as cx
    import datetime
    import tkinter as tk
    from tkinter import ttk
    from tkinter.messagebox import showinfo
     
     
    requeteUser = """ select user
                        from users
                        where  id=1"""
     
     
    def connexion(requeteUser):
     
        """
            fonction qui permet de réaliser la connexion avec la base oracle
        """
        exo=param1
        conn = cx.connect('user', 'user', 'test')
        curs = conn.cursor()
     
     
        #print (curs.description)
        curs.execute(requeteCommande)
        result = curs.fetchmany()
        for row in curs:
            print(row)
        # fermeture de la connexion a la base de donnée
        conn.close()
        return result
     
     
    if __name__ == "__main__":
        """ lancement du programme si utilisation de ce fichier
        """
        print(" programme en cours de dev!!!!")
        resultat = connexion(requeteUser)
        print("affichage resultat")
        #print(resultat) 
     
        # create root window
        root = tk.Tk()
        root.title('test)
        root.geometry('800x600')
     
        # columns
        columns = ('#1')
     
        # create a treeview
        tree = ttk.Treeview(root, columns = columns, show = 'headings', padding='10')
        tree.heading('#1', text='user', anchor='w')
        commande = []
        for result in resultat:
            tree.insert('',tk.END,values=result)
        # create treeview user
     
     
     
        # place the Treeview widget on the root window
        tree.grid(row=0, column=0, sticky='nsew') 
        # add a scrollbar
        scrollbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tree.yview)
        tree.configure(yscrollcommand=scrollbar.set)
        scrollbar.grid(row=0, column=1, sticky='ns')
     
     
        # run the app
        root.mainloop()

    dans ce code je voudrais par exemple pouvoir passer l’id en paramètre à ma fonction connexion, mais comment je peux la matérialiser dans la variable "requeteUSer".

    merci aux pros python qui pourront éclairer ma lanterne.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par lcrprod Voir le message
    dans ce code je voudrais par exemple pouvoir passer l’id en paramètre à ma fonction connexion, mais comment je peux la matérialiser dans la variable "requeteUSer".
    Déjà requeteUser est à la fois une variable globale et à la fois un paramètre de ta fonction. Donc fatalement côté relecture de code ça passe mal (en plus il y a ce exo=param1 qui vient d'on ne sais où... et ce fetchmany() qui, me semble-t-il, purge le curseur de tout son résultat)

    Si tu veux faire une requête avec juste "id" en paramètre, tu peux par exemple écrire ceci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def connexion(valID):
     
    	conn = cx.connect('user', 'user', 'test')
    	curs = conn.cursor()
    	curs.execute("select user from users where  id=%d" % valID)
    	res=curs.fetchall()
    	curs.close()
    	conn.close()
    	return res

    Ensuite si tu veux rajouter des mots clefs comme par exemple "distinct", "order" ou "limit", tu peux utiliser **kwargs. Exemple
    Code python : 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
    def connexion(valID, **kwargs):
    	conn = cx.connect('user', 'user', 'test')
    	curs = conn.cursor()
    	req="select"
     
    	if kwargs.pop("distinct"): req+=" distinct"
    	req+=" user from users where  id=%d" % valID
     
    	order=kwargs.pop("order", None)
    	if order is not None: req+=" order by %s" % order
     
    	limit=kwargs.pop("limit", None)
    	if limit is not None: req+=" limit %s" % limit
     
    	curs.execute(req)
    	res=curs.fetchall()
    	curs.close()
    	conn.close()
    	return res

    Et là tu peux appeler connexion(123), connexion(123, distinct=True), connexion(123, order="user asc"), connexion(123, limit=10) et tout mix entre ces différentes combinaisons. Après tu peux remplacer le return par un yield ce qui transforme ton résultat (un gros tableau) en générateur (un truc qui renvoie chaque ligne à la demande). Bref...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par lcrprod Voir le message
    dans ce code je voudrais par exemple pouvoir passer l’id en paramètre à ma fonction connexion, mais comment je peux la matérialiser dans la variable "requeteUSer".
    Construire dynamiquement une chaine de caractères à partir de variables et de littéraux est quelque chose qu'on doit savoir avant de faire des requêtes vers une base de données.

    Si vous utilisez un joujou tel que comme cx_oracle, il faut ouvrir la documentation car ce n'est peut être pas une bonne idée de fabriquer ses chaines de caractères. Pour des entiers, c'est pas si grave mais pour d'autres types de données, il y a des conversions de type à faire entre Python et la BDD... Et malheureusement, si le principe de base est le même, çà change d'une BDD à l'autre. Dans votre cas lire la documentation ici.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2003
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Bonjour,


    Merci pour les précieux conseil, j'ai effectivement commencé a utilisé l'arguments "args" et même "kwargs", mais ce que j'ai fais ne convenait pas.

    je vais voir la page sur les bind d'orale.

Discussions similaires

  1. [PHP 5.3] passage de requete sql par variables
    Par healou dans le forum Langage
    Réponses: 23
    Dernier message: 25/05/2011, 16h44
  2. Help problème de passage de requete SQL PHPMailer
    Par l.laurent60 dans le forum Langage
    Réponses: 1
    Dernier message: 17/06/2010, 17h53
  3. Passage de paramétre dynamique dans une requete SQL
    Par d.tellier dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/01/2010, 12h57
  4. Passage de parametres URL dans requete SQL
    Par Fenryl dans le forum ASP
    Réponses: 4
    Dernier message: 14/12/2005, 13h37
  5. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24

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