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

Bibliothèques tierces Python Discussion :

[SQL] Index des données insérées


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut [SQL] Index des données insérées
    Bonjour,

    je suis en train de créer un petit script Python qui devra insérer des données dans une base de données MySQL.
    Je gère la connexion à la base avec le fichier clsSQL.py donné ci-dessous :
    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
    ###
    # Methodes de connexion a la base MySQL
    ##
     
    import MySQLdb
     
    class clsSQL:
        def __init__(self, db, user, passwd, host, port=3306):
            try:
                self.connexion = MySQLdb.connect(db=db, user=user, passwd=passwd, host=host, port=port)
            except Exception, err:
                print 'Erreur de connexion SQL' % err
                self.echec = 1
            else:
                # Creation du curseur
                self.cursor = self.connexion.cursor()
                self.echec = 0
     
        def executequery (self,qry):
            try:
                self.cursor.execute(qry)
            except Exception, err:
                print 'Erreur execution SQL' % err
                return 0
            else:
                return 1
     
        def commit(self):
            if self.connexion:
                self.connexion.commit()
     
        def close(self):
            if self.connexion:
                self.connexion.close()
     
        def display_all(self):
             return self.cursor.fetchall()
    Ma requête est exécutée ainsi (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bdd = clsSQL(db,user,passwd,host)
     
    query = "INSERT INTO `mabase`.`matable` (`index` ,`champ1` ,`champ2` ,`champ3`) VALUES (NULL , '10' , '20', NULL);"
    bdd.executequery(query)
    bdd.display_all()
    J'ai ensuite besoin de récupérer le champ index (qui est un entier auto-incrémenté) pour réaliser un traitement ultérieur.
    Y a-t-il un moyen pour le faire ? Cela se ferait au niveau de Python ou par requête SQL ? (n'étant expert ni dans l'un ni dans l'autre...)

    Merci pour vos réponses et bon week-end !

    Alban
    « Se demander si un ordinateur peut penser est aussi intéressant que de se demander si un sous-marin peut nager. »
    -- Edsger Dijkstra

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 49
    Points : 45
    Points
    45
    Par défaut
    Je pense qu'un LAST_INSERT_ID() pourrait t'aider. Il faut regarder dans les forums et la doc mysql. tu y trouveras peut-être la réponse.
    Sous sqlalchemy, je sais que c'est faisable aussi.
    Si ça peut t'aider...
    Dominique

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 39
    Points
    39
    Par défaut
    Salut
    tu peux utiliser la requête sql SELECT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT max(index) FROM mabase.matable
    Mais pour la sélection je vois que tu ne peux pas utiliser la fonction que tu as défini dans ta classe pour exécuter la requête car ta fonction retourne 1 s'il n'y a pas d'exception ==> donc tu ne peux pas récupérer le contenu du curseur sauf si tu définis une autre fonction qui peut le retourner

    Remarque: n'oublie pas que l'index sera dans : nom_curseur[0][0]

    Bonne chance

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 39
    Points
    39
    Par défaut
    Aussi j'ai oublié de mentionner que déclarer le curseur comme étant attribut de la classe peut causer des problèmes au niveau du curseur si tu utilises plus qu'une fois la méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bdd.executequery(query)
    donc je propose de déclarer le curseur comme étant une variable locale de la méthode executequery

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def executequery (self,qry):
            cursor= self.connexion.cursor()
            try:
                cursor.execute(qry)
            except Exception, err:
                print 'Erreur execution SQL' % err
                return 0
            else:
                return 1

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Ok, merci pour toutes ces réponses !

    Donc finalement, pas de méthode miracle : c'est bien une requête à part.

    Mais dans ce cas, n'y a-t-il pas de problème si on a deux accès simultanés à la base ?
    Exemple :
    1. A insère des données -> index = 0
    2. B insère des données -> index = 1
    3. A récupère le dernier index -> index récupéré = 1
    Du coup, A va travailler sur de mauvaises données.

    Avant de vous faire chercher pour moi, je vais quand même voir s'il y a la possibilité d'utiliser des mutex au niveau de la base... (je ne sais même pas si ça existe).
    « Se demander si un ordinateur peut penser est aussi intéressant que de se demander si un sous-marin peut nager. »
    -- Edsger Dijkstra

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 49
    Points : 45
    Points
    45
    Par défaut
    Voilà quelques liens:



    http://dev.mysql.com/doc/refman/5.0/...insert-id.html

    Apparemment, le dernier ID généré est conservé par le serveur pour chaque connexion.
    Un autre client ne la modifiera donc pas, même s'il génère une autre valeur AUTO_INCREMENT.

    Dominique

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Parfait ! Merci
    « Se demander si un ordinateur peut penser est aussi intéressant que de se demander si un sous-marin peut nager. »
    -- Edsger Dijkstra

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 49
    Points : 45
    Points
    45
    Par défaut
    Avec SqlAlchemy, voilà ce que ça donne.

    1) Création de la base
    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
    from sqlalchemy import *
     
    db = create_engine('sqlite:///C:\\testDb.db')
    db.echo = False
    metadata = MetaData(db)
     
    ##### TABLE AND DATA CREATION
    persons = Table('persons', metadata,
        Column('person_id', Integer, primary_key=True),
        Column('name', String(40)),
        Column('age', Integer)
    )
    persons.create()
     
    i = persons.insert()
    i.execute({'name': 'John', 'age': 42},
              {'name': 'Susan', 'age': 57},
              {'name': 'Carl', 'age': 33})
     
    s = persons.select()
    rs = s.execute()
     
    for row in rs:
        print 'The userId of ',row.name,'is ',row.person_id, '. His age is ',row.age
    2) Insertion d'une nouvelle personne et récupération de l'id inséré:
    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
    from sqlalchemy import *
    from sqlalchemy.orm import mapper
    from sqlalchemy.orm import sessionmaker
     
     
    db = create_engine('sqlite:///C:\\testDb.db')
     
    db.echo = False
     
    metadata = MetaData(db)
    persons = Table('persons', metadata, autoload=True)
     
    class Person(object):
        def __init__(self, name = None, person_id = None):
            self.person_id = person_id
            self.name = name
     
    personmapper = mapper(Person, persons)
     
    Session = sessionmaker(bind=db, autoflush=True)
    mysession = Session()
     
    new_person = Person()
    new_person.name = 'Michael'
     
    mysession.save(new_person)
    mysession.flush()
    mysession.commit()
     
    user = Person(person_id = new_person.person_id)
    print 'user = ',user
    print 'user.person_id = ',user.person_id
    print 'user.name = ',user.name
    Le site de sqlalchemy: http://www.sqlalchemy.org/
    Un super tuto: http://www.rmunn.com/sqlalchemy-tutorial/tutorial.html
    Attention: remplacer BoundMetaData(db) par MetaData(db) et d'autres petites choses car ce tuto n'est pas à jour.

    Dominique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EXCEL] Comment indexer des données ?
    Par lunamaria dans le forum Excel
    Réponses: 1
    Dernier message: 14/07/2006, 11h56
  2. [pl/sql] Récupérer des données dans fichier
    Par claralavraie dans le forum Oracle
    Réponses: 22
    Dernier message: 13/07/2006, 16h49
  3. [MySQL] Introduire une variable dans requête SQL, insérer des données à la volée
    Par Ronan.f dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 29/04/2006, 22h10
  4. [PL/SQL] Saisir des données a partir du clavier
    Par future dans le forum Oracle
    Réponses: 11
    Dernier message: 30/03/2005, 12h12
  5. SQL - Traiter des données d'une table
    Par david71 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/02/2005, 16h47

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