我有一個.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,只知道函數的名稱和函數的輸入參數。聽起來很奇怪,這是一個要求。
我在做什麼錯?