Я возьму простейшую из 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, поэтому я, возможно, пропустил что-то очевидное.