Jangan gunakan "injeksi string" ke dalam SQL Anda kecuali untuk kasus yang benar-benar diperlukan, seperti str(DEPT)
di sini untuk memilih tabel yang Anda pilih. Untuk setiap kasus lainnya, gunakan fitur passing parameter dari Python DB API -- ini akan mengutip hal-hal dengan benar untuk Anda dan secara otomatis melindungi Anda dari serangan "injeksi SQL", antara lain. (Terkadang bisa juga lebih cepat).
Karena MySQLdb menggunakan notasi yang tidak menguntungkan %s
untuk parameter, inilah yang harus Anda lakukan (juga memperbaiki gaya agar sesuai dengan PEP8, tidak diperlukan tetapi tidak ada salahnya;-):
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 dalam format string yang menghasilkan q
menjadi satu %
masing-masing setelah memformat, jadi q
tersisa dengan dua kemunculan %s
-- yang execute
mengisi dengan rapi dengan versi CLASS
yang diformat dengan benar dan SEC
. Semua str
panggilan berlebihan, dll.
Sebagai tambahan, jika Anda menggunakan Python 2.6 atau lebih baru, untuk pemformatan string Anda harus menggunakan format
baru bukan metode lama %
operator -- yang menyelamatkan Anda dari kebutuhan akan "tanda-tanda % yang digandakan", di antara keuntungan lainnya. Saya belum menerapkan perubahan itu dalam cuplikan di atas untuk berjaga-jaga jika Anda terjebak dengan 2.5 atau lebih lama (jadi kode di atas berfungsi di versi Python apa pun, bukan hanya di versi yang cukup baru).