Pergunta

Estou ficando bravo com o MySQLdb!Estou seguindo exatamente o documento oficial, mas tenho um erro com o código:

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

Eu recebo o erro:

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

Obviamente há um problema com algumas citações.Meu comando parece enviar uma linha como esta para o MySQL:

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

Como posso alterar as aspas duplas por uma única?

Eu tentei o seguinte:

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

Mas nada funciona :(

Foi útil?

Solução

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

e em declarações semelhantes, o cursor.execute substituirá os parâmetros SQL em %s.

O que você precisa é algo assim

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

Outras dicas

Você não pode parametrizar o nome da tabela, portanto, você mesmo deve limpá-lo e usar a substituição de string na consulta.

Para higienizar um nome de tabela em uma consulta com vários parâmetros:

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

Neste ponto, a consulta será exibida como:

SELECT * FROM tableName WHERE columName = %s

Depois de construir seu cursor, use a condição parametrizada:

cursor.execute(query,(columnValue,))

A consulta real que o MySQL irá ler é:

SELECT * FROM tableName WHERE columnName = columnValue

Se você tentar passar o nome de uma tabela sem limpá-la, receberá um erro de sintaxe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top