2017-08-14 1 views
0

Voici le code qui ne fonctionne paspython avec insertion de requête mysql - seul paramètre

#!/usr/bin/python 

import urllib 
import datetime 
import mysql.connector 

data['price'] = 100 

# Write to database 
cnx = mysql.connector.connect(user='user', password='pw', database='db') 
cursor = cnx.cursor() 

query = ("INSERT INTO records(price) VALUES(%s) ") 
cursor.execute(query, (data['price'])) 

cnx.commit() 

cursor.close() 
cnx.close() 

MySQL a la table correspondante et de la colonne.

  • id (primaire INT AUTO_INCREMENT)
  • prix (FLOAT)

Il n'y a pas de problème de connexion.

Il provoque l'erreur suivante. Une idée?

Traceback (most recent call last): File "./sys-fetchdata.py", line 22, in cursor.execute(query, (data['price'])) File "/usr/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 507, in execute self._handle_result(self._connection.cmd_query(stmt)) File "/usr/lib/python2.7/dist-packages/mysql/connector/connection.py", line 722, in cmd_query result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) File "/usr/lib/python2.7/dist-packages/mysql/connector/connection.py", line 640, in _handle_result raise errors.get_exception(packet) 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 '%s)' at line 1

+0

@hiro_protagonist Merci. Vous devriez mettre cela en réponse. C'est là que le problème prend racine. –

Répondre

2

la MySQLCursor.execute() method prend une tuple (ou un dict) comme argument seconde (params).

dans votre cas: il devrait être (data['price'],) (notez la virgule supplémentaire, sans que les parenthèses n'aient aucun effet) au lieu de (data['price']).

+0

Merci, c'est un bug étrange. Ça me prend des heures avant de poster cette question. –

+0

je suis d'accord: le message d'erreur devrait être beaucoup plus informatif que c'est ... –

1

Essayons de trouver une solution:

  1. Ne pas exécuter votre requête, au lieu mogrify et l'imprimer. Par exemple:

    query = ("INSERT INTO records(price) VALUES(%s) ") 
    query_to_be_executed = cursor.mogrify(query, (data['price'])) 
    print(query_to_be_executed) 
    
  2. Ensuite, essayez d'exécuter votre requête imprimée manuellement dans bash ou phpMyAdmin et le fixer.

  3. Enfin, utilisez une requête fixe dans votre code python.
+0

Merci pour votre réponse. Cela devrait aider le processus de débogage, mais hiro avait indiqué la racine exacte du problème. –

+0

[mogrify] (http://initd.org/psycopg/docs/cursor.html#cursor.mogrify) est spécifique à l'adaptateur de base de données PostgreSQL 'psycopg'. [MySQL Connector/Python] (https://dev.mysql.com/doc/connector-python/en/) n'a pas 'mogrify', donc il ne peut pas être utilisé pour le contexte de cette question. – Odysseas

+0

Odysseas, je ne savais pas. Je sais que c'est une solution mais peut-être que l'auteur peut utiliser la base de données PostgreSQL? – tpszer