После быстрого просмотра метода execute () объекта Cursor пакета MySQLdb (я думаю, это своего рода де-факто пакет для интеграции с mysql), кажется, что (по крайней мере, по умолчанию) он только выполняет интерполяцию и цитирование строк, а не фактический параметризованный запрос:
if args is not None:
query = query % db.literal(args)
Если это не строковая интерполяция, тогда что это?
В случае executemany он фактически пытается выполнить вставку / замену как один оператор, а не выполнять его в цикле. Вот и все, никакой магии, кажется. По крайней мере, в поведении по умолчанию.
РЕДАКТИРОВАТЬ: О, я только что понял, что оператор по модулю может быть переопределен, но я чувствовал, что обманывает и искал источник. Однако нигде не найдено переопределенного значения mod
.