Meu palpite é que o problema é com o sinal de porcentagem (
%
) no texto da consulta. (Isso não é um placeholder de variável de ligação no Django?) se fôssemos usar uma variável de ligação, não seria algo assim? SELECT 'foo' FROM DUAL WHERE 'a' = %(varname)s ;
Eu acho que talvez o Django esteja escaneando seu texto SQL e encontrando
%w
e esperando que seja uma variável de ligação. Ou isso, ou está executando um sprintf
função de estilo e encontrar o %w
e esperando substituir esse espaço reservado por um valor de argumento. (Eu não testei; então isso é apenas uma ideia, apenas um palpite.)
Como um palpite para uma solução alternativa, talvez você dobre os sinais de porcentagem, o mesmo que obtemos % literais por meio de um sprintf:
query("SELECT ... ,'%%w') ...");
Se isso não funcionar, talvez seja um caractere de barra invertida, o mesmo que escapamos de caracteres em uma expressão regular:
query("SELECT ... ,'\%w') ...");
(Ou, você pode precisar dobrar as barras invertidas. Essas são apenas suposições baseadas em convenções usadas por outro software.)