Vous faites ce que vous voulez! Vous débutez. Discuter de ce que vous faites, c'est ajouter l'ambiguïté des mots à un sujet qui n'est pas compliqué mais qui demande de la précision: montrez un code complet qui ne pose pas de problèmes à être exécuté est bien plus efficace.
Je n'ai pas le temps d'installer MySQL pour construire un contexte qui ressemble au votre. Par contre, Python inclue sqlite3. Votre problème étant sur:
- l'écriture d'une instruction SQL,
- le passage de paramètre à cette requête,
Un code "complet" donnerait:
Exécutez le. Notez que j'ai remplacé %s par ?. Le standard Python côté DBAPI étant laxiste, ceux qui écrivent des drivers ont trop de liberté pour choisir les options pour passer des paramètres.
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 import sqlite3 as dbm import datetime ENTRY = ('serveur', 'etat', 'directive', 'regle') cnx = dbm.connect(':memory:') sql = "CREATE TABLE %s(id integer primary key AUTOINCREMENT, data text);" for name in ENTRY: cnx.execute(sql % name) sql = 'insert into %s(data) values (?)' for name in ENTRY: rs = cnx.execute(sql % name, (name, )) sql = """create table sedr (id integer primary key autoincrement, date datetime, serveur integer references server(id), etat integer references etat(id), directive integer references directive(id), regle integer references regle(id));""" cnx.execute(sql) sql = """INSERT INTO sedr (serveur, etat, directive, regle, date) SELECT serveur.id, etat.id, directive.id, regle.id, ? FROM serveur, etat, directive, regle WHERE serveur.data=? AND etat.data = ? AND directive.data = ? AND regle.data = ?""" cnx.execute(sql, (datetime.datetime.now(), 'serveur', 'etat', 'directive', 'regle')) row = cnx.execute('select * from sedr').fetchone() print (row) cnx.close()
Adaptez le pour le faire fonctionner chez vous avec MySQL et la définition de vos tables.
Bon courage.
- W
Merci Wiztricks pour vos efforts.
J'ai besoin de ma BDD mysql car travailler en mémoire ne va pas me permettre de développer mon application web d'analyse de ma base.
Dès que j'ai du temps, je suivrai votre conseil mais je dois faire fonctionner ma requête dans cet environnement. En effet, je débute et j'ai tellement de choses à apprendre que je ne peux pas tout faire en même. D'où mon utilisation des forums pour trouver de l'aide (et je vous en remercie) et des réponses quand je coince. Là je coince.
Encore merci.
Cdlt.
Bon, j'ai repris le dernier code que tu as posté....
T'as bien 6 placeholders et 5 variables.... Il en manque une. Tu semble avoir rajouté la dernière partie de ta clause where donc si on l'enlève et qu'on remet les variables dans l'ordre, ça doit donner un truc fonctionnel....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 query = """INSERT INTO serveur_etat_directive_regle (id_serveur, id_etat, id_directive, id_regle, log_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""" cursor.execute(query, (date, serveur, etat, directive, regle))
Bonjour,
Merci à Wiztricks qui m'avait donné la réponse le 25 avril à 17h23.Désolé de ne pas avoir su lire votre réponse correctement.
Merci Chticricri pour les pistes données.
Merci finalement à Marc3001 qui m'a donné la réponse aujourd'hui.
Je retiens de cela qu'il faut dans un requête imbriquée donner autant d'éléments à la première requête (INSERT dans mon cas) qu'à la deuxième (SELECT dans mon cas qui ne fait que remplacer le VALUES finalement). Ensuite dans le passage de ces éléments à un langage de procédure (dans moncas Python), passer le même nombre d'éléments dans un ordre établi en sachant qu'il faut placer en premiers les arguments présents dans la deuxième requête sous forme de variable (dans mon cas la date).
Bonne journée à tous.
Cordialement.
Partager