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 :

concatainer un list, une chaine et des float


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut concatainer un list, une chaine et des float
    Bonjour à tous,

    J'ai cette liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    values = ["une chaine", 1, 10.65]
    Afin de construire une requête SQL je dois insérer cette liste au sein de la requête tout en gardant le format de chaque valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO " + key[2] + "(`" + "`, `".join(fields) + "`) VALUES(" + ",".join(values) + ");"
    Ce qui devrait donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO  maTable(`champ1`, `champ2`, `champ3`) VALUES("une chaine", 1, 10.65);"
    Mais forcément comme j'essaie de mélanger des choux et des carottes cela ne marche pas
    TypeError: sequence item 3: expected string, float found
    Est-ce que vous auriez une piste ou deux ?
    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    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 695
    Par défaut
    Salut,

    Citation Envoyé par flipflip Voir le message
    Est-ce que vous auriez une piste ou deux ?
    L'API Python que réalise le pilote permet de passer des données en paramètres d'une requête et séparant la requête (une chaine de caractères) et le tuple des données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    query = "INSERT INTO  maTable(champ1, champ2, champ3) VALUES(?, ?, ?)"
    cursor.execute(query, ("une chaine", 1, 10.65))
    Mais l'API est laxiste: ici le caractère de remplacement est "?", le pilote a peut être choisi d'implémenter autre chose....
    Et vous devez ouvrir la documentation pour savoir que faire.

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

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Mais l'API est laxiste: ici le caractère de remplacement est "?", le pilote a peut être choisi d'implémenter autre chose....
    Je ne passe pas par l'API mysql. j'écris la requête dans un fichier sql qui est ensuite transféré sur une autre machine (celle qui exploite la base mysql) pour être importé. La machine qui exécute le script python est en prod pour l'ERP avec rien pour communiquer avec mysql, afin de garder la stabilité il n'est pas prévu d'installer le client mysql (Oracle est déjà installé dessus).

    J'ai testé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO " + key[2] + "(`" + "`, `".join(fields) + "`) VALUES(" + ", ".join(str(value) for value in values) + ");"
    Je me retrouve avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO  maTable(`champ1`, `champ2`, `champ3`) VALUES(une chaine, 1, 10.65);"
    Cela marcherais pour le champ de type int ou decimal mais se n'est plus bon pour les varchar ("une chaine" dans l'exemple).

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    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 695
    Par défaut
    Salut,

    Alors pour convertir un int/float en string, on lu applique str(...).

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

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Alors pour convertir un int/float en string, on lu applique str(...).

    - W
    C'est qu'il me semble faire avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO " + key[2] + "(`" + "`, `".join(fields) + "`) VALUES(" + ", ".join(str(value) for value in values) + ");"
    Mais plus j'y et plus je me dis que mon problème est lié à quand encadrer la valeur par des double quotes ou pas.

    Si je reprend mon exemple du début

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    values = ["une chaine", 1, 10.65]
    - une chaine : doit être encadré
    - 1 et 10.65 : ne doivent pas être encadré

    Avant de poster j'avais ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO " + key[2] + "(`" + "`, `".join(fields) + "`) VALUES(\"" + "\", \"".join(values) + "\");"
    Le résultat était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO  maTable(`champ1`, `champ2`, `champ3`) VALUES("une chaine", "1", "10.65");"
    Les double quotes étaient gérés mais ils s'appliquaient à toutes les valeurs de la liste values. J'ai l'impression q'avec join() c'est un peu le serpent qui se mord la queue ?

    Je rappel que je souhaite atteindre ce résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "INSERT INTO  maTable(`champ1`, `champ2`, `champ3`) VALUES("une chaine", 1, 10.65);"

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    J'ai trouvé une solution (peut être pas la plus classe) :

    tab[] est ma liste principal contenant toute les données

    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
    for line in tab:
      fields = []
      values = ""
      delimitor = ""
      key = line[0].split("|")
      for elem in line:
        if type(elem) is dict:
          fields.append(elem.keys()[0])
          if values != "":
            delimitor = ", "
     
          if type(elem.values()[0]) == int:
            values = values + delimitor + str(elem.values()[0])
          elif type(elem.values()[0]) == float:
            values = values + delimitor + str(elem.values()[0])
          else:
              values = values + delimitor + "\"" + elem.values()[0] + "\""
          query = "INSERT INTO " + key[2] + "(`" + "`, `".join(fields) + "`) VALUES(" + str(values) + ");"

Discussions similaires

  1. Vérifier si une chaine contient des caractères spéciaux
    Par BenoitDenis dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2006, 16h26
  2. passer d'une chaine contenant des espaces a un tableau
    Par flyfrog dans le forum Contribuez
    Réponses: 3
    Dernier message: 26/06/2006, 20h12
  3. Réponses: 4
    Dernier message: 29/05/2006, 15h27
  4. Extraire pls morceaux d'une chaine dans des variables!
    Par baillador dans le forum Langage
    Réponses: 10
    Dernier message: 05/04/2006, 13h21
  5. [VB.NET] Compléter une chaine avec des espaces
    Par Lois dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 09h09

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