例として、最も単純な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;
これをコピーしてpsql(PostgreSQLのシェル)に貼り付けると、問題なく実行されます。
このようなPythonコードを(もちろん実際のデータベース名とユーザーを使用して)作成すると、次のようになります。
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)
実行されているように見えますが(エラーは発生しません)、データベースを調べたところ、関数がありません。
コードをapp/sql / model.sqlファイルに入れてDjangoで実行しようとすると、syncdb中に次のエラーが発生します。
IndexError: tuple index out of range
SQLを実行する独自のmanage.pyコマンドを作成しようとすると、同じエラーが発生します。
何が起きてる?これに光を当てることができた人にはとても感謝しています:)PythonとDjangoに関してはまだ初心者なので、明らかなことを見落としているかもしれません。