Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как пройти сад граблей при миграции с SQLite3 на MySQL в Django или «not enough arguments for format string» при построении raw-запросов?

Почти неделю пытаюсь перевести проект Django c SQLite на MySQL. Уже прошел сад граблей с настройками SQL-сервера, хоста, удаленного доступа, файрвола, переноса данных, различий в размерах полей и построении индексов... И вот последние (надеюсь) грабли с "not enough arguments for format string":

Имеется raw-запрос:
from project.models import my_model
import re
import urllib

def Autocomplete_Addr ( request ):
    msg = u""
    SQLquery = u""
    part = re.split ("[, /;|]*", urllib.unquote(request.GET['term']))
    for i in part[:-1]:
        SQLquery += u"(sAddress LIKE '%%%s%%') AND " % i
    SQLquery += u"(sAddress LIKE '%%%s%%') " % part[-1]

    SQLquery = u"SELECT   id, sAddress " + \
               u"FROM     project_adress_list " + \
               u"WHERE    " + SQLquery +\
               u"ORDER BY sAddress " \
               u"LIMIT    10;"
    qu = my_model.objects.raw(SQLquery)
    for i in qu:
        msg += '"' + i.sAddress + u'",'

Который порождает исключение:

Exception Value: not enough arguments for format string

Ошибка возникает в строчке:
for i in qu:
Интернет даёт массу ответов о причинах такой ошибки, но пока проверка последовательно всех из них показывает, что проблема, похоже, где-то не в области "отсутствия аргументов в строке".

P.S. Возможно знатоков наведут на ответ предыдущие "грабли". Точно такая же ошибка возникала в предыдущей строке, когда она была немного иной:
qu = my_model.objects.raw(SQLquery)[:10]
Отказавшись от [:10] и добавление LIMIT 10 в raw-SQL-запрос ошибка была решена, и... теперь возникает в следующей строке!
  • Вопрос задан
  • 2646 просмотров
Решения вопроса 1
Sergei_Erjemin
@Sergei_Erjemin Автор вопроса
Улыбайся, будь самураем...
Вопрос решился после полного переноса всех данных и перестроения всех индексов.
В базе SQLite строки "что-то" и "что-то " (отличие в завершающем пробеле) считаются уникальными. В mySQL такие строки уникальностью не обладают. Из-за этого, похоже, и были все проблемы.

P.S. Различие в скорости исполнения запросов через ORM и RAW для MySQL не столь существенно, как в SQLite. Что говорит скорее о качестве работы ORM а не самой базы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Убрать raw, использовать icontains?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы