Je vais prendre le plus simple des fonctions SQL comme exemple:Pourquoi psycopg2 n'exécute-t-il aucune de mes fonctions SQL? (IndexError: indice de tuple hors de portée)
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;
Si je copier et coller dans psql (le shell de PostgreSQL), il exécute sans aucun problème .
Si j'écris un morceau de code Python comme celui-ci (avec un vrai nom de base de données et l'utilisateur bien sûr):
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)
Il semble d'exécuter (il ne me donne pas une erreur), mais quand je regarde dans la base de données, la fonction n'est pas là.
Lorsque je tente d'exécuter le code de Django en le mettant dans une application/sql/fichier model.sql Je reçois l'erreur suivante lors de syncdb:
IndexError: tuple index out of range
Lorsque je tente d'écrire mon propre gérer. commande py qui exécuterait le sql, je reçois la même erreur.
Que se passe-t-il ici? Je serais très reconnaissant à tous ceux qui pourraient faire la lumière sur ce sujet :) Je suis toujours un novice quand il s'agit de Python et Django, donc j'ai peut-être oublié quelque chose d'évident.
Seriez-vous en mesure d'ajouter l'instruction réelle que vous exécutez dans "curseur.execute (sql_function_above) "(ou montre où vous définissez 'sql_function_above' si vous voulez littéralement utiliser cet identifiant) –
Dites-nous comment vous avez défini sql_function_above 'dans votre code python – nos
Désolé, c'était une simplification de ma part. J'ai essayé d'écrire la variable de différentes façons, j'ai aussi essayé de lire le texte depuis un fichier sql, tous ont produit la même erreur, l'une des nombreuses façons dont j'ai écrit la variable éditée dans la question originale. réponses - c'est la première fois que j'utilise stackoverflow.com et l'utilité et la rapidité des réponses de votre part est incroyable :) –