В качестве примера я возьму простейшую из функций 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)
Это кажется выполненным (это не дает мне ошибки), но когда я просматриваю базу данных, функции там нет.
Когда я пытаюсь выполнить код в Django, поместив его в файл app / sql / model.sql, я получаю следующую ошибку во время syncdb:
IndexError: tuple index out of range
Когда я пытаюсь написать собственную команду manage.py, которая будет выполнять sql, я получаю ту же ошибку.
Что здесь происходит? Был бы очень признателен всем, кто мог бы пролить свет на это :) Я все еще новичок, когда дело доходит до Python и Django, поэтому, возможно, я упустил что-то очевидное.