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

Langage SQL Discussion :

Erreur au moment de l'insertion dans une table.


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 42
    Points : 16
    Points
    16
    Par défaut Erreur au moment de l'insertion dans une table.
    Bonjour,

    Je développe une petite application qui récupère des fichiers logs, les injecte dans une base de données MySQL pour permettre à des administrateurs de mieux gérer un pool de serveurs.

    Ma base comporte 5 tables.
    Une table des serveurs, une table des états, une table des directives, un table des règles et une table reprenant les id des 4 premières tables plus un champ date. Les 4 premières tables ont deux champs : id et nom.
    Après lecture et sélection des informations pertinentes des fichiers logs, j'insère dans les 4 premières tables les nouveaux serveurs, états, règles et directives si nécessaire.
    La cinquième table est alimentée en partie en allant récupérer des données dans les quatre premières tables et en ajoutant la date du fichier log.
    C'est là où ça coince.
    J'obtiens le message d'erreur suivant :
    Traceback (most recent call last):
    File "C:\Users\pidlas\Documents\rudder_find.py", line 58, in <module>
    extract(info)
    File "C:\Users\pidlas\Documents\rudder_find.py", line 46, in extract
    cursor.execute(query, (serveur, etat, directive, regle, date,))
    File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 183, in execute
    query = query % db.literal(args)
    TypeError: not all arguments converted during string formatting
    Ma requête SQL intégré dans mon code Python est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    """INSERT INTO serveur_etat_directive_regle (serveur, id_etat, id_directive, id_regle, date)
    SELECT id_serveur, id_etat, id_directive, id_regle FROM serveur, etat, directive, regle
    WHERE nom_serveur = %s AND nom_etat = %s AND nom_directive = %s AND nom_regle = %s"""
    J'ai d'abord posé ma question sur le forum Python. Wiztricks m'a indiqué que le message renvoyait à l'écart qui existe entre les champs de l'INSERT INTO, il y en a 5, et les champs de la clase WHERE, il y en a 4.

    Si vous me confirmez cela, j'aimerai une piste pour faire en sorte que ma requête fonctionne car la date ne provient pas des 4 tables mais du fichier log qui est lu par mon programme Python.

    Je vous laisse également mon code Python pour que vous compreniez l'image globale c'est assez court pour l'instant)
    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
     
    # -*- coding: utf-8 -*-
    # modules nécessaires
    from os import chdir
    import MySQLdb as mdb
    import sys
    import datetime
     
    # variables pour la BDD
    serveur = ''
    etat = ''
    regle = ''
    directive = ''
     
    # répertoire où se trouve les logs
    chdir("c:/Users/pidlas/Documents/rudder/")
     
    def extract(log):
        for ligne in log:
            debut_date = ligne.find('[')
            fin_date = ligne.find(']')
            date = ligne[debut_date+1:fin_date-5]
            date = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
            sep_N = ligne.find('N:')
            serveur = ligne[ligne.find('[',sep_N)+1:ligne.find(']',sep_N)]
            sep_S = ligne.find('S:')
            etat = ligne[ligne.find('[',sep_S)+1:ligne.find(']',sep_S)]
            sep_R = ligne.find('R:')
            regle = ligne[ligne.find('[',sep_R)+1:ligne.find(']',sep_R)]
            sep_D = ligne.find('D:')
            directive = ligne[ligne.find('[',sep_D)+1:ligne.find(']',sep_D)]
     
            try:
                db = mdb.connect('localhost', 'root', '', 'rudder');
                cursor = db.cursor()
                query = """INSERT IGNORE INTO serveur (nom_serveur) VALUES (%s)"""
                cursor.execute(query, (serveur,))
                query = """INSERT IGNORE INTO etat (nom_etat) VALUES (%s)"""
                cursor.execute(query, (etat,))
                query = """INSERT IGNORE INTO directive (nom_directive) VALUES (%s)"""
                cursor.execute(query, (directive,))
                query = """INSERT IGNORE INTO regle (nom_regle) VALUES (%s)"""
                cursor.execute(query, (regle,))
                query = """INSERT INTO serveur_etat_directive_regle (serveur, id_etat, id_directive, id_regle, date)
                        SELECT id_serveur, id_etat, id_directive, id_regle FROM serveur, etat, directive, regle
                        WHERE nom_serveur = %s AND nom_etat = %s AND nom_directive = %s AND nom_regle = %s"""
                cursor.execute(query, (serveur, etat, directive, regle, date,))
            except mdb.Error, e:
                print "Error %d: %s" % (e.args[0],e.args[1])
                sys.exit(1)
            db.commit()
     
        info.close()
        db.close()
        return logfile
     
    if __name__ == "__main__":
        with open('non-compliant-reports.log','r') as info:
            extract(info)
    J'apprécierai toute l'aide que vous pourrez m'accorder.

    Cordialement.

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Dans le INSERT vous spécifiez 5 champs tandis que vous avez 4 valeurs dans le VALUES.
    Le code SQL doit être...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    """INSERT INTO serveur_etat_directive_regle (serveur, id_etat, id_directive, id_regle, date)
    SELECT id_serveur, id_etat, id_directive, id_regle, %s  FROM serveur, etat, directive, regle
    WHERE nom_serveur = %s AND nom_etat = %s AND nom_directive = %s AND nom_regle = %s"""
    et l'exécution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute(query, ( date, serveur, etat, directive, regle))
    @+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 42
    Points : 16
    Points
    16
    Par défaut
    Merci pour votre réponse.
    Je teste cela lundi prochain.
    Je bosse à mi-temps en ce moment.
    Bon week-end et à lundi.

Discussions similaires

  1. [AC-2010] Erreur 3134 lors d'une insertion dans une table
    Par SYNEQUANON dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 09/05/2015, 09h32
  2. Réponses: 6
    Dernier message: 14/05/2009, 11h01
  3. Réponses: 2
    Dernier message: 09/06/2008, 21h51
  4. Erreur lors d'insertion dans une table avec Indentity
    Par rad_hass dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/03/2008, 15h22
  5. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24

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