Nie używaj „wstrzykiwania ciągów” do kodu SQL, z wyjątkiem przypadków, w których jest to naprawdę niezbędne, takich jak str(DEPT)
tutaj, aby wybrać stół, z którego wybierasz. W każdym innym przypadku zamiast tego użyj funkcji przekazywania parametrów w Python DB API — będzie ona właściwie cytować i automatycznie bronić Cię między innymi przed atakami typu „wstrzyknięcie SQL”. (Czasami może być też szybciej).
Ponieważ MySQLdb używa niefortunnej notacji %s
jeśli chodzi o parametry, oto co powinieneś zrobić (także naprawienie stylu, aby był zgodny z PEP8, nie jest to wymagane, ale nie zaszkodzi;-):
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))
%%
s w formatowaniu ciągu, które daje q
stać się pojedynczym %
każdy po formatowaniu, więc q
pozostały dwa wystąpienia %s
-- które execute
wypełnia się ładnie poprawnie sformatowanymi wersjami CLASS
i SEC
. Wszystkie str
połączenia są zbędne itp.
Na marginesie, jeśli korzystasz z Pythona 2.6 lub nowszego, do formatowania ciągów powinieneś użyć nowego format
metoda zamiast starego %
operator - to oszczędza ci między innymi korzyściami "podwojonych znaków %". Nie zastosowałem tej zmiany w powyższym fragmencie na wypadek, gdybyś utknął z wersją 2.5 lub wcześniejszą (więc powyższy kod działa w dowolnej wersji Pythona, a nie tylko w całkiem nowych).