Django MySql Raw Query Error - Индекс параметра вне диапазона - PullRequest
1 голос
/ 12 февраля 2010

Это представление работает нормально на обычном питоне / Django / mysql в Windows
Я портирую это для запуска через jython / Django / mysql и выдает ошибку -

Exception received is : error setting index [10] [SQLCode: 0]    
Parameter index out of range (10 > number of parameters, which is 0). [SQLCode: 0],  
[SQLState: S1009]

Запрос -

cursor.execute("select value from table_name    
where value_till_dt >= str_to_date('%s,%s,%s,%s,%s', '%%m,%%d,%%Y,%%H,%%i')    
AND value_till_dt <=  str_to_date('%s,%s,%s,%s,%s', '%%m,%%d,%%Y,%%H,%%i')    
and granularity='5'    
ORDER BY value_till_dt",    
[int(tempStart.month),int(tempStart.day), int(tempStart.year), int(tempStart.hour), int(tempStart.minute),    
int(tempEnd.month), int(tempEnd.day), int(tempEnd.year), int(tempEnd.hour), int(tempEnd.minute)])

Как видите, в этот запрос передается 10 параметров. Означает ли ошибка, что запрос не получает параметры?

Я распечатал параметры непосредственно перед выполнением, и они отображаются как переданные правильно -

1 - Start Parameters being passed are : 1 11 2010 10 0   
2 - End Parameters being passed are : 1 11 2010 10 5

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

Любые мысли приветствуются.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

Это действительно проблема стиля параметров. Вы должны использовать? вместо% s.

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

shell> jython
>>> from com.ziclix.python.sql import zxJDBC
>>> (d, v) = "jdbc:mysql://localhost/test", "org.gjt.mm.mysql.Driver"
>>> cnx = zxJDBC.connect(d, None, None, v)
>>> cur = cnx.cursor()
>>> cur.execute("SELECT %s", ('ham',))
..
zxJDBC.Error: error setting index [1] [SQLCode: 0]
Parameter index out of range (1 > number of parameters,
  which is 0). [SQLCode: 0], [SQLState: S1009]

Теперь, если вы используете кавычки вокруг знака?, Вы получите ту же проблему:

>>> cur.execute("SELECT '?'", ('ham',)) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zxJDBC.Error: error setting index [1] [SQLCode: 0]
Parameter index out of range (1 > number of parameters,
  which is 0). [SQLCode: 0], [SQLState: S1009]

Смысл в том, чтобы не использовать кавычки и позволить интерфейсу базы данных сделать это за вас:

>>> cur.execute("SELECT ?", ('ham',))  
>>> cur.fetchall()
[(u'ham',)]

Вот как я бы это сделал в коде. Сначала вы создаете строки, которые собираетесь использовать для функций str_to_date (), например:

start = "%d,%d,%d,%d,%d" % (int(tempStart.month),
  int(tempStart.day), int(tempStart.year),int(tempStart.hour), 
  int(tempStart.minute))
stop = "%d,%d,%d,%d,%d" % (int(tempEnd.month),
  int(tempEnd.day), int(tempEnd.year), int(tempEnd.hour),
  int(tempEnd.minute))

Вы делаете оператор SELECT, но не используете кавычки и передаете его курсору. Интерфейс базы данных сделает всю работу за вас. Также в качестве параметра мы указываем значение гранулярности.

select = """SELECT value FROM table_name
  WHERE value_till_dt >= str_to_date(?, '%%m,%%d,%%Y,%%H,%%i')
  AND value_till_dt <= str_to_date(?, '%%m,%%d,%%Y,%%H,%%i')
  AND granularity=?
  ORDER BY value_till_dt
"""
cursor.execute(select, (start,stop,5))

Надеюсь, это поможет!

0 голосов
/ 12 февраля 2010

Вы уверены, что маркер параметра %s, а не ? или даже :parameter? Проверьте аргумент paramstyle модуля DB-API, чтобы узнать.

...