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

  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) + ");"

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par flipflip Voir le message
    (peut être pas la plus classe)
    Je confirme

    Citation Envoyé par flipflip Voir le message
    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);"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python3
    # coding: utf-8
     
    def makeQuery(listeChamps, listeValeurs):
    	c=", ".join("`%s`" % x for x in listeChamps)
    	v=", ".join(("\"%s\"" if isinstance(x, str) else "%s") % x for x in listeValeurs)
    	return (c, v)			# Ca peut évidemment s'écrire en une ligne (les variables "c" et "v" n'étant utilisées qu'une fois chacune)...
    # makeQuery()
     
    values = ["une chaine", 1, 10.65]
    q=makeQuery(("Champ1", "Champ2", "Champ3"), values)
    print("insert into table (%s) values (%s)" % q)

    Citation Envoyé par flipflip Voir le message
    J'ai l'impression q'avec join() c'est un peu le serpent qui se mord la queue ?
    Non, faut juste savoir comment il fonctionne: str.join(iterable) te retourne une nouvelle chaine contenant la chaine ayant lancé le join placée entre chaque élément de l'itérable. Exemple "<br>".join(("xxx", "yyy", "zzz")) => "xxx<br>yyy<br>zzz". Bon c'est sûr que le fait que la chaine principale soit placée entre chaque élément (donc ni au début ni à la fin) peut être un peu déroutant... mais juste un peu.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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