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 :

Problème script python/mysql


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Points : 31
    Points
    31
    Par défaut Problème script python/mysql
    Bonjour,

    Le script que je créé, sert a récupérer des données de l'api OpenFoodFact pour les insérer dans une base Mysql.

    J'ai deux problème que je n'arrive pas à gérer :
    - lignes 39-46 je n'arrive pas a drop ma table

    - Lignes 19-28 et 62-67 quand j'essaie de récupérer les données, ça me recupere bien la première category de l'api mais pas la suite, et j'ai ce message d'erreurs :

    Traceback (most recent call last):
    File "Classe.py", line 71, in <module>
    create_dataBase = OpenFoodFact()
    File "Classe.py", line 18, in __init__
    self.get_category()
    File "Classe.py", line 30, in get_category
    self.data_base.insert_data_category(data[i])
    File "Classe.py", line 66, in insert_data_category
    self.cursor.execute(add_category)
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mysql/connector/cursor_cext.py", line 266, in execute
    raw_as_string=self._raw_as_string)
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 475, in cmd_query
    sqlstate=exc.sqlstate)
    mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'origine végétale')' at line 1
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    # -*- coding: utf-8 -*-
    import mysql.connector
    import pprint
    import requests
    from Constant import *
     
     
     
    class OpenFoodFact :
     
     
    	def __init__(self):
    		self.data_base = dataBaseMySql()
    		self.data_base.create_data_base()
    		self.get_category()
     
     
    	def get_category(self):
    		'''get category from API's openfoodfacts'''
    		resp_category = requests.get('https://fr.openfoodfacts.org/categories&json=1')
    		data_category_json = resp_category.json()
    		data_tags_category = data_category_json.get('tags')
    		data = [d.get('name') for d in data_tags_category]
     
     
    		for i in range(10):
    			self.data_base.insert_data_category(data[i])
     
     
     
    class dataBaseMySql:
     
    		def __init__(self):
    			self.data_base = mysql.connector.connect(user=MYSQL_USER, password=MYSQL_PWD, host=MYSQL_HOST, database=MYSQL_DATABASE)
     
     
     
    		def delete_table(self):
    			self.cursor = self.data_base.cursor()
    			self.cursor.execute("""
                                    DROP TABLE IF EXISTS `Category`,
                                    DROP TABLE IF EXISTS `Food`,
                                    DROP TABLE IF EXISTS `Substitute`
                                    """);
    			self.data_base.commit()
     
    		def create_data_base(self):
    			self.cursor = self.data_base.cursor()
    			self.cursor.execute("""
                                    CREATE TABLE `Category` (
                                            `idCategory` int(11) NOT NULL AUTO_INCREMENT,
                                            `category` varchar(1000) NOT NULL,
                                            PRIMARY KEY (idCategory)
                                            )
                                            """);
    			self.data_base.commit()
    			self.cursor.close()
     
     
     
    		def insert_data_category(self, category):
    			self.cursor = self.data_base.cursor()
    			add_category = ("INSERT INTO Category" "(category)" "VALUES('{}')".format(category))
    			self.cursor.execute(add_category)
    			self.data_base.commit()
    			self.cursor.close()
     
     
    create_dataBase =  OpenFoodFact()

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par mac79 Voir le message
    - ligne 41-47 je ne comprends pas pourquoi ça n'efface pas les données de ma base Mysql
    Soyons précis. L'effacement de données en bdd c'est "delete from table [where ...]". Les lignes 41-47 c'est du "drop table" (suppression de table). Après je suis pas un pro de MySQL mais il se peut que les tables soient liées à d'autres par des contraintes d'intégrité (dans ce cas impossible de supprimer la table "maitre" sans demander à "cascader" sur les tables "esclaves" => drop table nom_table cascade). Enfin bon ça c'est valable surtout pour Postgres qui gère les contraintes et je ne sais pas si MySQL le fait mais c'est à creuser.
    Il se peut qu'il y ait aussi un manque de "commit"...

    Mais de toute façon t'attends quoi pour demander un retour de ta commande pour voir comment MySQL l'a traitée.
    Et t'as aussi le droit d'accéder à MySQL depuis le shell et taper ces requêtes à la mano pour voir ce qu'il te répond. Et pourquoi pas aussi aller checker les logs...

    Citation Envoyé par mac79 Voir le message
    - Ligne 21-30 et 63-68 quand j'essaie de récupérer les données, ça me recupere bien la première category de l'api mais pas la suite, et j'ai ce message d'erreurs :
    Oui ben tu l'as lu le message d'erreur ? Si on remonte depuis les lib py/mysql (qui sont évidemment hors de cause) on arrive à la ligne 66 de ton code qui dit que ta commande "insert" est incorrecte.
    Ensuite on remonte jusqu'à la ligne qui crée la chaine d'insert (ligne 64) et là on voit que cette chaine correspond (littéralement) à INSERT INTO Category(category)VALUES(...). Me semble qu'il manque certains espaces dans l'ordre d'insert...
    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]

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par mac79 Voir le message
    - Lignes 19-28 et 62-67 quand j'essaie de récupérer les données, ça me recupere bien la première category de l'api mais pas la suite, et j'ai ce message d'erreurs
    Si le message d'erreur est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'origine végétale')' at line 1
    et que la dernière ligne incriminée de votre code est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File "Classe.py", line 66, in insert_data_category
    self.cursor.execute(add_category)
    alors, il faut revoir cette instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		add_category = ("INSERT INTO Category" "(category)" "VALUES('{}')".format(category))
    côté SQL car pour Python c'est juste une chaîne de caractères.

    Et pour çà ouvrir la documentation/exemples de mysql.connector pour voir comment coder un INSERT.

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

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bon je me suis trompé (je viens de tester sous Postgres). Un ordre d'insert peut se faire sans espaces entre les mots-clefs qui suivent le nom de la table.
    Donc voir remarque de wiztricks concernant la syntaxe...
    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]

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Je me pose une question au sujet de : add_category = ("INSERT INTO Category" "(category)" "VALUES('{}')".format(category))
    Est-il normal d'avoir trois chaînes au lieu d'une ? : add_category = ("INSERT INTO Category (category) VALUES('{}')".format(category))

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par danielhagnoul Voir le message
    Est-il normal d'avoir trois chaînes au lieu d'une ?
    Si ce n'était pas "normal", le programme aurait planté sur cette instruction là.
    Une autre façon de voir si la syntaxe est correcte est de lancer l'interpréteur Python pour voir ce qu'il en fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> ("INSERT INTO Category" "(category)" "VALUES('{}')".format('1234'))
    "INSERT INTO Category(category)VALUES('1234')"
    Après on peut lire la documentation au chapitre qui parle de la concaténation des chaines de caractères.... qui donne des exemples où c'est cool de pouvoir le faire.

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

Discussions similaires

  1. [Python 3.X] Problème Scripts python en .exe
    Par Ghastyr dans le forum Général Python
    Réponses: 2
    Dernier message: 22/12/2017, 22h16
  2. Affichage image en html avec script python et mysql blob
    Par senacle dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 18/11/2009, 20h22
  3. Réponses: 1
    Dernier message: 02/04/2009, 17h10
  4. Réponses: 1
    Dernier message: 02/04/2009, 17h10
  5. Problème de base MySQL avec installation de script
    Par JoN28fr dans le forum Installation
    Réponses: 3
    Dernier message: 27/10/2005, 19h34

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