понедельник, 25 марта 2013 г.

Django: ошибка not enough arguments for format string


Столкнулся с проблемой при использовании Django и MySQL, которую подробно описал на созданном для этого баг тикете. В кратце, если вы захотите минуя ORM сделать запрос к БД вида (ключевым моментом здесь является использование знака % в значении оператора):
from django.db import connection
...
cursor=connection.cursor()
cursor.execute('SELECT * from `test`.`test_table` WHERE name LIKE "Jo%";')

То произойдет ошибка Exception raised: not enough arguments for format string.

Ошибка происходит из за разногласия в передаче параметров (кортеж () вместо None) от django backend'ом

django/db/backends/util.py:36

def execute(self, sql, params=()):
к библиотке БД
MySQLdb/cursors.py:139

def execute(self, query, args=None):
...
        if args is not None:
            query = query % db.literal(args)

Ошибку можно избежать если явно указать передаваемый параметр как None:

cursor.execute('SELECT * from `test`.`test_table` WHERE name LIKE "Jo%";', None)

Что касается самого тикета, то его сразу же закрыли сославшись на дубликат, который относится ... к пятилетней давности!!! Простейший ошибка живет уже 5 лет по непонятной причине. Я был о django сообществе несколько лучшего мнения.

5 комментариев:

  1. Это опенсорц, если кому надо, тот шлет патчи или оформляет запрос на слияние. Раз до сих пор висит ошибка — значит не сильно-то и надо.

    ОтветитьУдалить
    Ответы
    1. Удачное совпадение вышло, после моего тикета позитивное движение произошло, которое вылилось в fix https://code.djangoproject.com/changeset/76aecfbc4b49f5ab0613cccff1df6fab03253fab

      Удалить
  2. А кто вам мешал исправить этот баг, если он по-вашему мнению простейший, вместо того, что бы просто выделываться тут, гневаясь на сообщество?

    P.S. - для блога с 15-ю сообщениями за 3.5 года, как-то мало рекламы... вон же ещё справа есть место

    ОтветитьУдалить
  3. Если по факту: я и предложил решение, но нужно было его тестировать на всех поддерживаемых Джангой БД, чего я сделать не могу, но может кто то иной, чего я и попросил.

    Если не по факту: >>просто выделываться тут, гневаясь на сообщество?
    >>вон же ещё справа есть место
    улыбнуло) люди так любят додумывать за других

    ОтветитьУдалить
  4. Евгений, не обращайте внимание на школьников). Спасибо за блог! Пишите, по возможности, чаще.

    ОтветитьУдалить