2011-09-19 6 views
9

La mia domanda Postgres è:Come ottenere inserito o selezionato di fila id in Postgres usando python

query = """INSERT INTO statustable(value) SELECT '%s' 
       WHERE NOT EXISTS (SELECT id, value FROM statustable 
       WHERE value = '%s') RETURNING id""" % (status, status) 
    cursor_postgres.execute(query) 
    conn_postgres.commit() 
    statusId = cursor_postgres.fetchone()[0] 
    print "statusId" + str(statusId) 

ho bisogno di ottenere il valore di stato di recente inserito id se doesnt esiste, oppure selezionare il relativo ID se già esiste. RETURNING id ha soffocato questa query interamente, quindi ho dovuto rimuoverlo per fare in modo che l'inserimento selettivo funzioni.

Eventuali indizi su come ottenere lo stato ID qui? In un altro caso sto facendo un Upsert. (Inserisci se non esiste, aggiorna altrimenti) Anche in questo caso, ho bisogno dell'ID di riga inserito o aggiornato. (No, non sto usando stored procedure, se quella fosse la vostra prima domanda ...)

Grazie in anticipo

+0

Mi sembra che il modo più rapido per eseguire questa operazione sia probabilmente eseguire tre query (all'interno di una transazione, se necessario). 1) "SELECT id FROM statustable WHERE value = '% s'"% (status) 2) Se non viene restituita alcuna riga, "INSERT INTO statustable (valore), '% s'"% (stato). 3) "SELECT curval (pk_seq)" qualunque sia il nome di pk_seq come sequenza per l'id della chiave primaria. Ma poiché questo non è quello che hai chiesto, non è in una risposta. –

+0

grazie per la risposta @ed. Infact 2 e 3 possono essere uniti da 'INSERT INTO statustable (valore), '% s' RETURNING id"% (status) 'in quanto ciò restituirà anche l'id. Ma stavo cercando di mettere tutto in uno. – jerrymouse

risposta

10

Non posso dire di capire appieno la vostra motivazione per insistere su una singola query. Penso che la soluzione migliore sia avere due semplici domande:

  1. SELECT id FROM statustable WHERE value = '%s'. Questo ti dà l'id se la voce esiste, nel qual caso salta il passaggio 2;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id. Questo ti darà il id della voce appena creata.

Infine, anche se non ho verificato se si tratta di un problema, lo fetchone() attraverso un commit sembra leggermente sospetto.

+0

Grazie per il replay @aix, ho fatto proprio questo, ho biforcuto la mia domanda in 2. La mia motivazione per la singola query era solo per testare se è possibile farlo perché è apparso fattibile. fetchone() è usato attraverso un commit perché l'ID RESTITUZIONE non lo fa t restituire id a meno che non sia stato eseguito il commit (stavo ottenendo un tipo None) – jerrymouse

Problemi correlati