Dugaan saya adalah masalahnya ada pada tanda persen (% ) dalam teks kueri. (Bukankah itu tempat penampung variabel ikat di Django?) mis. jika kita akan menggunakan variabel bind, bukankah itu akan terlihat seperti ini?
SELECT 'foo' FROM DUAL WHERE 'a' = %(varname)s ;
Saya pikir mungkin Django sedang memindai teks SQL Anda dan menemukan %w dan mengharapkan itu menjadi variabel pengikat. Entah itu, atau menjalankan sprintf fungsi gaya, dan menemukan %w dan berharap untuk mengganti placeholder itu dengan nilai argumen.
(Saya belum menguji; jadi ini hanya ide, hanya tebakan.)
Sebagai tebakan untuk solusinya, mungkin Anda menggandakan tanda persen, sama seperti kita mendapatkan % literal melalui sprintf:
query("SELECT ... ,'%%w') ...");
Jika itu tidak berhasil, maka mungkin itu adalah karakter garis miring terbalik, sama seperti kita menghindari karakter dalam ekspresi reguler:
query("SELECT ... ,'\%w') ...");
(Atau, Anda mungkin perlu menggandakan garis miring terbalik. Ini hanya tebakan berdasarkan konvensi yang digunakan oleh perangkat lunak lain.)