为什么不psycopg2执行我的任何SQL职能?(异常:tuple指出的范围)
-
20-09-2019 - |
题
我会把简单的SQL功能作为一个例子:
CREATE OR REPLACE FUNCTION skater_name_match(INTEGER,VARCHAR)
RETURNS BOOL AS
$$
SELECT $1 IN (SELECT skaters_skater.competitor_ptr_id FROM skaters_skater
WHERE name||' '||surname ILIKE '%'||$2||'%'
OR surname||' '||name ILIKE '%'||$2||'%');
$$ LANGUAGE SQL;
如果我抄和粘贴到的原因(PostgreSQL的外壳的),然后执行,没有任何问题。
如果我写一张蟒蛇这样的代码(与真实的数据库名称和用户的课程):
import psycopg2
sql_function_above = '''CREATE OR REPLACE FUNCTION skater_name_match(INTEGER,VARCHAR)
RETURNS BOOL AS
$$
SELECT $1 IN (SELECT skaters_skater.competitor_ptr_id FROM skaters_skater
WHERE name||' '||surname ILIKE '%'||$2||'%'
OR surname||' '||name ILIKE '%'||$2||'%');
$$ LANGUAGE SQL;'''
try:
connection = psycopg2.connect("dbname='x' user='x' host='localhost' password='x'");
except:
print "I am unable to connect to the database"
cursor = connection.cursor()
cursor.execute(sql_function_above)
它的 似乎 执行(它不是给我一种错误),但是,当我看到数据库的功能是不存在的。
当我试图执行中的代码Django通过把它变成一个应用程序/sql/模型。sql文件我得到的以下错误期间syncdb:
IndexError: tuple index out of range
当我试着写我自己manage.py 命令,将执行sql,我得到同样的错误。
什么在这里?将非常感谢任何人可能阐明这一点:)我还是个新手的时候向Python和Django,所以我可能忽略的东西,显而易见的。
解决方案
默认情况下psycopg2标识使用%
符号参数占位符(通常你必须在字符串中%s
)。
所以,如果你使用cursor.execute('... %s, %s ...', (arg1, arg2))
那么这些%s
得到化作分别ARG1和ARG2的值。
不过既然你打电话。cursor.execute(sql_function_above)
,没有额外的参数,和你的SQL包括%
签署库试图找到传递给函数的第二个参数 - 这是超出范围,因此一个IndexError
<强>解决方案:强>代替使用%
的,写在SQL变量%%
。这获取,然后再将其发送到PostgreSQL翻译成一个文字%
。
其他提示
看起来就像你是不是犯下事务:
尝试把:
cursor.execute("COMMIT")
之后,最后一行,并看到如果这一工作。
你还可以设置的隔离水平自动提交,如:
connection.set_isolation_level(0)
更多的信息,在这 答案
索引超出范围意味着你试图访问(例如)的元组,其不仅具有两个元件的第三元件。注意,Python的索引从0开始,所以命名myTuple一个两元素的元组将具有元件myTuple [0]和myTuple [1],但没有元素myTuple [2]。