2017-04-12 111 views
1

我有一個.sql文件,我使用psql命令行加載。這個文件包含我所有的函數定義。我從python腳本調用此文件中定義的函數。從python調用postgresql函數的問題

我正面臨一個奇怪的問題。我宣佈我的.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

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