从python

时间:2017-04-12 03:00:09

标签: python sql postgresql

我有一个.sql文件,我使用psql命令行加载。该文件包含我的所有函数定义。我从python脚本调用此文件中定义的函数。

我面临着一个奇怪的问题。我在我的.sql文件中声明了一个函数,如下所示:

CREATE OR REPLACE FUNCTION Add_to_stroke(my_stroke VARCHAR(50))
RETURNS VOID
AS $$
    BEGIN
        INSERT INTO stroke VALUES (my_stroke);
    END $$
LANGUAGE plpgsql
VOLATILE;

我从我的python文件中调用此函数,如下所示:

conn = psycopg2.connect("dbname=postgres user=postgres password=psswd")
cur = conn.cursor()
cur.callproc('Add_to_stroke','freestyle')

我收到以下错误消息:

 ProgrammingError: function add_to_stroke(unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown) does not exist
    LINE 1: SELECT * FROM add_to_stroke('f','r','e','e','s','t','y','l',...
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

当我从psql命令行调用此函数时,如下所示,它可以正常工作:

SELECT Add_to_stroke('Freestyle')

另外,我试图显示我创建的所有功能,并且有一个Add_to_stroke函数。

我最初认为这个问题是由于从字符串转换到其他问题而引起的。但是,当我以类似的方式调用其他具有VARCHAR(50)变量的表的函数时,它可以工作。这些表与此表之间的唯一区别是这些表具有多个属性,而且这个表只有一个属性。

我用以下行替换了cur.callproc()行:

foo = 'Freestyle'
 cur.execute("SELECT add_to_stroke(%s)",(foo,))

现在它正常运作。

但是,我不想使用cur.execute,因为我必须自己显式写一个sql语句。这里的假设是使用python的人不知道如何编写sql并且只知道函数的函数名和输入参数。听起来很奇怪,这是一个要求。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

根据http://initd.org/psycopg/docs/cursor.html#cursor.callproc,使用callproc的正确方法应该是:

cur.callproc('Add_to_stroke', ['freestyle'])

或使用元组:

cur.callproc('Add_to_stroke', ('freestyle',))

或使用命名参数:

cur.callproc('Add_to_stroke', {'my_stroke': 'freestyle'})