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