2010-01-26 4 views
9

Idéalement, je voudrais pouvoir faire quelque chose comme:De retour avec une valeur psycopg2

id_of_new_row = cursor.lastrowid() 

où je reçois l'id de la ligne nouvellement créée ou modifiée. Mais ce n'est pas disponible via psycopg2. Sinon, je l'ai essayé ceci:

id_of_new_row = cursor.execute('INSERT INTO this_table (value1, value2, value3) VALUES (%s, %s, %s) RETURNING id', (some_value1, some_value2, some_value3)) 

qui ne fonctionne pas, probablement parce qu'il ne saura pas l'identifiant qu'après la validation est faite ...

Aide!

+0

Quel genre d'identité que vous essayez d'obtenir - OID ou la valeur d'un champ déclaré de série? –

+0

Je ne sais pas. Je suis nouveau. C'est un projet django, et django configure la base de données postgres avec syncdb basé sur mes modèles. Je ne suis pas sûr que django déclare l'OID lors de la création de la table automatiquement. J'ai besoin de la clé primaire de chaque ligne, qui est auto-générée en tant que "id" par django, sauf indication contraire. Je vais faire un peu de lecture. –

Répondre

19

Bien sûr que oui, il connaîtra l'ID dès la fin de la commande, c'est ainsi que RETURNING est implémenté. Vous devez effectivement aller chercher, donc quelque chose comme:

cursor.execute("INSERT INTO .... RETURNING id") 
id_of_new_row = cursor.fetchone()[0] 

devrait fonctionner dans votre scénario.

+0

Incroyable. Merci! –

+0

est l'index le seul moyen d'extraire les valeurs du résultat de la requête d'exécution. Est-ce que trois façons d'obtenir de la valeur? comme row.id? –

3

travaux sur RETOURNANT Postgresql> = 8.2