2012-05-31 5 views
0

У меня есть команда управленияВыполнение SQL В функции

from django.db import connection 
from django.core.management.base import BaseCommand 

class Command(BaseCommand): 
    args = "[id]" 

    def handle(self, id, **options): 
    ids = [] 
    if '-' in id: 
     splitted = id.split('-') 
     for n in range(int(splitted[0]), int(splitted[1])+1): 
      ids.append(n) 
    else: 
     ids.append(id) 
    c = connection.cursor() 
    c.execute('SELECT content FROM log WHERE id IN %s', [ids]) 

Я могу запустить это, введя имя команды и указать В параметре (ID)

Когда я бегу command 200-205, для цикла возвращает список:

ids =[200, 201, 202, 203, 204, 205] 

И ставит это в запросе:

SELECT content FROM log WHERE id IN (200, 201, 202, 203, 204, 205) 

Briljant!

Когда я бегу command 200 Идентификаторы будет:

ids = [200] 

Выполнение запроса возвращает ошибку:

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 1") 

Похоже SELECT content FROM log WHERE id IN (200) не работает в то время как он должен.

Что я здесь делаю неправильно?

ответ

1

Ваш код выглядит нормально для меня, но я не владеет в этих библиотеках Django. Несколько (возможно, очевидных) обходных идей: (1) построить два разных оператора SQL для выполнения; в случае с одним ID, это просто SELECT content FROM log WHERE id = (2) снова для случая с одним ID, создайте массив с двумя экземплярами желаемого идентификатора, чтобы Django создавал этот SQL: SELECT content FROM log WHERE id IN (200, 200). Другими словами,

else: 
    ids.append(id) 
    ids.append(id) 
+0

Если я это сделаю, я получаю сообщение об ошибке: _mysql_exceptions.Warning: Усеченное неправильное значение DOUBLE: '' 200 '' – nelsonvarela

+0

Ничего ... Ваше решение сработало для меня! – nelsonvarela

+0

Вы поехали с опцией (1) или опцией (2)? –

0

Не хватает ли скобок в скобках?

SELECT content FROM log WHERE id IN 200 

против

SELECT content FROM log WHERE id IN (200) 
+0

Это, кажется, идет совершенным при добавлении parenthesses, но затем он идет неправильно при выполнении команды с диапазоном: 200-205 ... Следующая ошибка: Операнд должен содержать 1 колонку (s) – nelsonvarela

+0

Если вы можете распечатать/отобразить/записать SQL-запрос, который вы пытаетесь выполнить перед его выполнением, вы можете обнаружить проблему очень быстро. –

+0

К сожалению, я не могу распечатать. – nelsonvarela

Смежные вопросы