Django Raw SQL дает мне TypeError недостаточно аргументов - PullRequest
2 голосов
/ 27 июля 2011

У меня есть этот необработанный запрос:

counters = Counter.objects.raw("""
            SELECT id, name FROM building_counter c
            INNER JOIN scope_scope_buildings ssb 
                    ON c.building_id = ssb.building_id
                    AND ssb.scope_id = %s
            WHERE  energy_id = %s
            AND parent_id is not NULL
            AND type = "C"
           """, [self.id, energy_id])

Результат дал мне:

TypeError: not enough arguments for format string 
[2, 1L]

Я не понимаю, что с ним не так: s

Ответы [ 3 ]

2 голосов
/ 27 июля 2011

Реальная проблема заключается в том, что вы передаете список параметрам, но затем вы пытаетесь вызвать repr для результата (я знаю это только потому, что у меня возникла та же проблема при запуске в ipython). Что вам нужно сделать, это передать в кортеж:

counters = Counter.objects.raw("""
        SELECT id, name FROM building_counter c
        INNER JOIN scope_scope_buildings ssb 
                ON c.building_id = ssb.building_id
                AND ssb.scope_id = %s
        WHERE  energy_id = %s
        AND parent_id is not NULL
        AND type = 'C'
       """, (self.id, energy_id))

Или вы можете применить этот патч к вашему источнику django, и он превратит их в кортежи, когда вы в оболочке.

Если вы не часто используете оболочку для необработанных запросов, вы можете просто проигнорировать это, поскольку остальная часть django прекрасно обрабатывает параметры списка.

1 голос
/ 27 июля 2011

Вы должны использовать '%s' вместо %s

counters = Counter.objects.raw("""
        SELECT id, name FROM building_counter c
        INNER JOIN scope_scope_buildings ssb 
                ON c.building_id = ssb.building_id
                AND ssb.scope_id = '%s'
        WHERE  energy_id = '%s'
        AND parent_id is not NULL
        AND type = 'C'
       """, [self.id, energy_id])
0 голосов
/ 04 сентября 2012

Вам также нужно использовать% d для первого заполнителя, поскольку self.id будет целым числом, а не строкой.% d указывает строке ожидать int в этом слоте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...