2009-09-17 43 views
1

我使用PyGreSQL來訪問我的數據庫。在我目前正在使用的用例中,我試圖插入一條記錄表中並返回最後ROWID ...又名的DB我的ID字段所創造的價值:pygresql - 插入並返回串行

create table job_runners (
    id   SERIAL PRIMARY KEY, 
    hostname  varchar(100) not null, 
    is_available boolean default FALSE 
    ); 

sql = "insert into job_runners (hostname) values ('localhost')" 

當我使用的db.insert(),這使得最有意義的是,我收到了一個「AttributeError」。當我嘗試db.query(sql)時,我什麼也得不到,只有一個OID。

問:使用PyGreSQL什麼是插入記錄,並沒有做任何額外的讀取或查詢返回的ID字段的值的最佳方式?

+0

請提供更多信息:db.insert()/ db.query()的實際調用,確切的錯誤消息,Postgres和PyGreSQL的版本等。 – 2009-09-17 12:10:44

回答

0

在PyGreSQL文檔說,如果你調用dbconn.query()與和插入/更新語句,這將返回OID。當涉及多個行時,它繼續說出一些關於OID列表的內容。

首先的;我發現OID功能不起作用。我想知道庫和工具的版本號會有所幫助,但是,我並沒有試圖返回OID。

最後;通過將「返回ID」,由@hacker的建議,pygresql只是做了正確的事情,(見下面的代碼)返回記錄集與生成的字典中的ID。

sql = "insert into job_runners (hostname) values ('localhost') returning id" 
rv = dbconn.query(sql) 
id = rv.dictresult()[0]['id'] 
+0

我認爲你的示例代碼缺少'RETURNING'位;-) – 2009-09-17 17:11:05

1
INSERT INTO job_runners 
    (hostname,is_available) VALUES ('localhost',true) 
    RETURNING id 

這就是說,我不知道pygresql的想法,但你所編寫的程序,我想這是要在這裏使用db.query()

+0

@hacker - 雖然上面的SQL幫助我明確指出了問題使用pygresql並從數據庫中獲取該ID。 – Richard 2009-09-17 16:45:05

+0

從數據庫獲取ID是在'RETURNING'部分。我假設你知道如何獲得'db.query()'產生的結果。沒有這一點,它不會把生成的id傳回客戶端。 – 2009-09-17 17:05:54

+0

剛剛看了你自己的答案,你自己的問題;-)的OID的事情是不是很好的辦法,因爲你並不總是有OID,我不認爲'INSERT'是有史以來返回多個OID做(但我不確定,因爲我從來沒有使用它),最後你仍然必須從OID中推斷'id'。那麼''''''''currval('job_runners_id_seq')'會更容易做到。 – 2009-09-17 17:10:30

0

假設你有一個光標對象cur

cur.execute("INSERT INTO job_runners (hostname) VALUES (%(hostname)s) RETURNING id", 
      {'hostname': 'localhost'}) 
id = cur.fetchone()[0] 

這確保正確PyGreSQL逸出的輸入字符串,以防止SQL注入。