MySQLdb:aspas duplas passadas para a consulta
-
13-12-2019 - |
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 :(
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.