Domanda

Sto arrabbiando con mysqldb!Sto seguendo esattamente il documento ufficiale ma ho un errore con il codice:

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,))
.

ottengo l'errore:

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")
.

Ovviamente c'è un problema con alcune citazioni.Il mio comando sembra inviare una linea come questa a MySQL:

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

Come posso cambiare la doppia citazione da parte di uno single?

I'V ha provato i seguenti:

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

Ma nulla funziona: (

È stato utile?

Soluzione

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

E in dichiarazioni simili, il cursor.execute sostituirà i parametri SQL in% s.

Quello di cui hai bisogno è qualcosa di simile a questo

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

Altri suggerimenti

Non è possibile il nome della tabella parametrizzato, quindi devi smanisi di te stesso e utilizzare invece la sostituzione della stringa nella query.

to sanitize un nome tabella in una query con più parametri:

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

A questo punto, la query verrà visualizzata come:

SELECT * FROM tableName WHERE columName = %s
.

Una volta costruito il cursore, usa la condizione parametrizzata:

cursor.execute(query,(columnValue,))
.

La query attuale che MySQL leggerà quindi è:

SELECT * FROM tableName WHERE columnName = columnValue
.

Se si tenta di passare in un nome di un tavolo senza disinfettarlo, riceverai un errore di sintassi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top