我会把简单的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]。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top