Question

Je suis fou de MySQLdb !Je suis en suivant exactement la doc officielle, mais j'ai une erreur avec le code :

DB_TABLE = "test"
cursor.execute("SELECT MAX(id) AS maxid FROM " + DB_TABLE)
print "***"
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , (DB_TABLE,))

J'obtiens l'erreur :

Traceback (most recent call last):
  File "dbscript.py", line 49, in <module>
    cursor.execute("SELECT MAX(id) AS maxid FROM %s" , (DB_TABLE,))
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/cursors.py", line 174, in execute
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
_mysql_exceptions.ProgrammingError: (1064, "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 ''test'' at line 1")

Évidemment, il y a un problème avec quelques citations.Ma commande semble envoyer une ligne de ce genre pour MySQL :

SELECT MAX(id) AS maxid FROM ''test''

Comment puis-je changer le double devis par un seul ?

Je v essayé les choses suivantes :

DB_TABLE = 'test'
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , [DB_TABLE])
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , ("test",))

Mais rien ne marche :(

Était-ce utile?

La solution

cursor.execute("SELECT MAX(id) AS maxid FROM %s" , ("test",)) 

et dans les autres états, la cursor.execute remplacer des paramètres SQL dans %s.

Ce que vous avez besoin est quelque chose comme cela

sql = "SELECT MAX(id) AS maxid FROM %s" % ("test", )
cursor.execute(sql)

Autres conseils

Vous ne pouvez pas le nom de table paramétré, vous devez donc l'assainir vous-même et utiliser la substitution de chaîne dans la requête à la place.

à assainir un nom de table dans une requête avec plusieurs paramètres:

query = "SELECT * FROM %s WHERE columnName = %s" % (tableName,'%s')
print(query)

À ce stade, la requête s'affiche comme suit:

SELECT * FROM tableName WHERE columName = %s

Une fois que vous avez construit votre curseur, utilisez la condition paramétrée:

cursor.execute(query,(columnValue,))

La requête réelle que MySQL lira ensuite est:

SELECT * FROM tableName WHERE columnName = columnValue

Si vous essayez de passer un nom de table sans l'assainir, vous obtiendrez une erreur de syntaxe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top