Nepoužívejte "string injection" do vašeho SQL s výjimkou případů, kdy je to skutečně nezbytné, jako je str(DEPT)
zde si můžete vybrat, ze kterého stolu vybíráte. Pro každý jiný případ použijte místo toho funkci předávání parametrů v Python DB API – bude za vás věci správně citovat a mimo jiné vás automaticky ochrání před útoky typu „SQL injection“. (Někdy to může být i rychlejší).
Protože MySQLdb používá nešťastnou notaci %s
pokud jde o parametry, zde je to, co byste měli udělat (také opravit styl tak, aby vyhovoval PEP8, není vyžadováno, ale nemůže ublížit;-):
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 ve formátování řetězce, které vytváří q
stát se jedním %
každý při formátování, takže q
je ponechán se dvěma výskyty %s
-- které execute
se úhledně vyplní správně naformátovanými verzemi CLASS
a SEC
. Všechny str
hovory jsou nadbytečné atd.
Kromě toho, pokud používáte Python 2.6 nebo novější, pro formátování řetězců byste měli použít nový format
namísto starého %
operátor -- to vás kromě jiných výhod zbaví potřeby těch "zdvojených % znaků". Tuto změnu jsem ve výše uvedeném úryvku neaplikoval jen pro případ, že jste zůstali u verze 2.5 nebo starší (takže výše uvedený kód funguje v jakékoli verzi Pythonu, nikoli pouze v těch přiměřeně nejnovějších).