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.