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

Python Discussion :

Erreur sur insertion d'une date dans MySQL


Sujet :

Python

  1. #21
    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
    Citation Envoyé par chticricri Voir le message
    Désolé, je n'avais pas fait très attention aux placeholders

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     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  AND log_date = %s"""
    cursor.execute(query, (date, serveur, etat, directive, regle, date))
    Si j'ai bien saisi, les premier et dernier paramètres à passer sont la date.

    Décidément, je travaille trop
    Non, seul le dernier paramètre est la date.
    Peut être pourriez-vous m'expliquer précisément ce que je ne comprends pas. Wiztricks parle d'autant d'éléments dans le tuple que de %s dans le statement SQL. Quels sont nommément ces éléments ? Pour moi, il y en a 5 et donc autant.

  2. #22
    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
    Citation Envoyé par wiztricks Voir le message
    Salut
    Débrouillez vous comme vous voulez mais tant qu'il n'y aura pas autant d'éléments dans le tuple que de %s dans le statement SQL, çà ne fonctionnera pas.
    - W
    Bonsoir,

    Vous voulez-dire que je dois ajouter dans le cursor.execute() les colonnes id_serveur, id_etat, id_regle, id_directive ?

    Cdlt.

  3. #23
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par pidlas Voir le message
    Vous voulez-dire que je dois ajouter dans le cursor.execute() les colonnes id_serveur, id_etat, id_regle, id_directive ?
    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:
    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()
    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.
    Adaptez le pour le faire fonctionner chez vous avec MySQL et la définition de vos tables.

    Bon courage.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #24
    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 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.

  5. #25
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    Citation Envoyé par pidlas Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     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  AND log_date = %s"""
    cursor.execute(query, (serveur, etat, directive, regle, date))
    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))
    Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

    Linus Torvalds

  6. #26
    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
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. insertion d'une date dans une table mysql
    Par hunter99 dans le forum SGBD
    Réponses: 6
    Dernier message: 14/12/2007, 23h17
  2. insertion d'une date dans une table
    Par yousfi.z dans le forum JDBC
    Réponses: 3
    Dernier message: 07/08/2006, 15h32
  3. Insertion d'une date dans une table avec vba
    Par skeut dans le forum Access
    Réponses: 2
    Dernier message: 21/02/2006, 08h54
  4. [Format Date] erreur sur insertion d'une date
    Par philobedo dans le forum SQL
    Réponses: 4
    Dernier message: 14/06/2005, 10h41
  5. insertion d'une date dans visual foxpro
    Par yvescollet dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/05/2005, 15h39

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