Bonjour,

C'est une question qui me semble être plus liée à Python qu'à MySQL car je peux faire l'insertion sans problème avec phpmyadmin.

Je m'explique :
Mon programme fonctionne très bien si j'enlève l'insertion du champ date.
Si je l'ajoute (et j'en ai vraiment besoin) j'ai l'erreur 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
Dans ma base MySQL, le champs date est déclaré en datetime. Donc le format attendu est : AAAA-MM-JJ HH:MM:SS
Ma variable python date est exactement formaté comme cela.
Pour être encore plus sûr j'ai utilisé le module datetime pour réaliser une conversion chaîne vers date.

Rien n'y fait. Avec ou sans conversion j'ai le même message d'erreur.

Voici mon code Python :

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)
Je débute dans tout cela et j'apprécierai votre aide et vos conseils.

Cordialement.