2011-09-19 95 views
9

我的Postgres的查詢選擇行ID在Postgres的是:如何獲得插入或使用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) 

我需要獲得新插入的狀態值id如果它不存在,或者選擇其ID,如果已經存在。 RETURNING id完全窒息了這個查詢,所以我不得不將它刪除到至少得到選擇性插入工作。

任何線索如何獲得statusId在這裏?在另一個例子中,我正在做一個Upsert(插入如果不存在,則另行更新)在這裏,我需要插入或更新的行ID。 (不,我不使用存儲過程,如果這是你的第一個問題...)提前

+0

它讓我感到最快的方法是做三個查詢(如果需要的話,在一個事務中)。 1)「SELECT id FROM statustable WHERE value ='%s'」%(status)2)如果沒有行返回,「INSERT INTO statustable(value),'%s'」%(status)。 3)「SELECT curval(pk_seq)」,無論pk_seq被稱爲主鍵id的序列。但是由於這不是你要求的,這不是一個答案。 –

+0

感謝回覆@ed。 Infact 2&3可以通過INSERT INTO statustable(value),'%s'RETURNING id「%(status)'進行合併,因爲這也會返回id,但我一直在尋找將這一切歸爲一整體 – jerrymouse

回答

10

感謝我不能說我完全理解你的堅持在一個查詢的動機。我認爲你最好的選擇是有兩個簡單的查詢:

  1. SELECT id FROM statustable WHERE value = '%s'。如果條目存在,這會給你id,在這種情況下跳過第2步;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id。這會給你新創建的條目的id

最後 - 雖然我沒有驗證這是否是一個問題 - fetchone()跨整個提交看起來有些懷疑。

+0

Thanks for重播@aix,我這樣做了,我把查詢分成了2個。我對單個查詢的動機只是爲了測試它是否可以完成,因爲它看起來可行。fetchone()用於整個提交,因爲RETURNING id doesn'除非有提交,否則返回id(我得到一個None類型) – jerrymouse