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 :
Ma requête SQL intégré dans mon code Python est la suivante :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
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.
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"""
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 globalec'est assez court pour l'instant)
J'apprécierai toute l'aide que vous pourrez m'accorder.
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)
Cordialement.
Partager