2017-04-12 32 views
1

私はpsqlコマンドラインを使ってロードする.sqlファイルを持っています。このファイルには、すべての関数定義が含まれています。このファイルで定義されている関数を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)の変数を持つ他のテーブルの関数を呼び出すと、関数は動作します。これらの表とこの表との唯一の違いは、これらの表に複数の属性があり、この属性には1つの属性しかないことです。

私は次の行でcur.callproc()の行に置き換え:

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

をそして今、それが正常に動作します。

しかし、私は明示的にSQL文を自分で書く必要があるため、cur.executeは使用しません。ここでの仮定は、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'}) 
関連する問題