Не използвайте „инжектиране на низ“ във вашия SQL, освен в случаите, когато това е наистина необходимо, като str(DEPT)
тук, за да изберете от каква таблица избирате. За всеки друг случай използвайте вместо това функцията за предаване на параметри на API на Python DB – тя ще цитира правилно нещата вместо вас и автоматично ще ви защити от атаки с „SQL инжекция“, наред с други неща. (Понякога може да бъде и по-бързо).
Тъй като MySQLdb използва злополучната нотация %s
за параметрите, ето какво трябва да направите (също коригиране на стила, за да бъде съвместим с PEP8, не се изисква, но не може да навреди;-):
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 във форматирането на низа, което произвежда q
стане единичен %
всеки при форматиране, така че q
остава с две поява на %s
-- които execute
попълва спретнато с правилно форматирани версии на CLASS
и SEC
. Всички str
повикванията са излишни и т.н.
Като настрана, ако сте на Python 2.6 или по-нова версия, за форматиране на низ трябва да използвате новия format
метод вместо стария %
оператор - това ви спестява от нуждата от тези "удвоени % знаци", наред с други предимства. Не съм приложил тази промяна в горния фрагмент само в случай, че сте останали с 2.5 или по-стара версия (така че кодът по-горе работи във всяка версия на Python, вместо само в сравнително скорошни).