Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Erro do Python e do mySQLdb:OperationalError:(1054, coluna desconhecida na 'cláusula where')


Não use "injeção de string" em seu SQL, exceto nos casos em que é realmente indispensável, como o str(DEPT) aqui para escolher de qual tabela você está selecionando. Para todos os outros casos, use o recurso de passagem de parâmetro da API Python DB - ele citará as coisas corretamente para você e o defenderá automaticamente contra ataques de "injeção de SQL", entre outras coisas. (Também pode ser mais rápido, às vezes).

Como o MySQLdb usa a infeliz notação %s para parâmetros, aqui está o que você deve fazer (também corrigindo o estilo para ser compatível com PEP8, não obrigatório, mas não pode prejudicar;-):
conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))

O %% s na formatação de string que produz q tornar-se um único % cada um na formatação, então q fica com duas ocorrências de %s -- que o execute preenche perfeitamente com versões formatadas corretamente de CLASS e SEC . Todos os str chamadas são redundantes, etc.

Como um aparte, se você estiver no Python 2.6 ou posterior, para formatação de string, você deve usar o novo format método em vez do antigo % operador -- que evita a necessidade daqueles "sinais de % dobrados", entre outras vantagens. Eu não apliquei essa alteração no trecho acima apenas no caso de você estar preso na versão 2.5 ou anterior (portanto, o código acima funciona em qualquer versão do Python, em vez de apenas nas razoavelmente recentes).