gpt4 book ai didi

python - Django MySql 原始查询错误 - 参数索引超出范围

转载 作者:行者123 更新时间:2023-11-29 07:14:36 29 4
gpt4 key购买 nike

此 View 在 Windows 上的普通 pyton/Django/mysql 上运行良好
我将其移植到 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

第二个环境中的唯一不同是没有此日期范围内的可用数据。但错误似乎与数据无关。

如有任何想法,我们将不胜感激。

最佳答案

确实是参数样式问题。你必须使用?而不是 %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]

关键是不要使用引号,让数据库接口(interface)为你做:

>>> 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 语句,但不使用任何引号,并将其传递给游标。数据库接口(interface)将为您完成这项工作。此外,我们将“粒度”值作为参数。

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))

希望对您有所帮助!

关于python - Django MySql 原始查询错误 - 参数索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248321/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com