2016-06-08 73 views
0

我正在使用pg8000模塊將python腳本連接到postgreSQL數據庫,我想插入一些新行。當我運行這個腳本時,我沒有遇到任何錯誤,它看起來運行良好,但是當我查看錶格後,實際上沒有添加任何內容。Python/PostgreSQL插入行沒有效果

什麼是困惑我的是,如果我打印出來的查詢語句,我與pg8000光標對象執行,然後只是複製/粘貼,並在pgAdmin的界面執行它,它正確地插入一個新行。

另一個奇怪的事情是,表中有一個基於SERIAL的ID字段,每次插入行時都會自動更新。當我運行腳本時,該序列正在更新。我可以告訴B/C下一個要添加的ID,例如6000.如果我運行腳本(它應該添加大約1000行但不是),然後手動插入一行,新行的ID爲7000.

這裏的循環創建和執行的語句:

for row in new_signs: 
    query = "INSERT INTO {0}_signs (source_link, destination_link, exit_number) VALUES ({1},{2},'{3}');".format(city,row[0],row[1],row[2]) 
    print query 
    cursor.execute(query) 

而且一些示例輸出:

INSERT INTO osm_newyork_signs (source_link, destination_link, exit_number) VALUES (56423,1833854,'26'); 
INSERT INTO osm_newyork_signs (source_link, destination_link, exit_number) VALUES (353212,310961,'45'); 
INSERT INTO osm_newyork_signs (source_link, destination_link, exit_number) VALUES (203823,1862344,'63N'); 

而且表定義:

CREATE TABLE public.osm_newyork_signs 
(
    source_link integer NOT NULL, 
    destination_link integer NOT NULL, 
    exit_number text, 
    "Branch_RouteID" character varying(64), 
    "Branch_RouteDir" character varying(6), 
    "Sign_TextType" character varying(6), 
    "Sign_Text" character varying(255), 
    "Toward_RouteID" character varying(64), 
    "Straight_On" character varying(255), 
    id integer NOT NULL DEFAULT nextval('osm_newyork_signs_id_seq'::regclass), 
    CONSTRAINT newyork_signs_pkey PRIMARY KEY (id), 
    CONSTRAINT check_branch_toward CHECK ("Sign_TextType"::text = 'B'::text OR  "Sign_TextType"::text = 'T'::text OR "Sign_TextType" IS NULL) 
) 
WITH (
    OIDS=FALSE 
); 
+0

你有沒有機會使用會話,忘記提交查詢? –

+0

不是我所知道的。我只是創建一個連接使用 conn = pg.connect(user ='',password ='',host ='',database ='') cursor = conn.cursor() – wmebane

回答

4

由於默認情況下自動提交功能處於關閉狀態,除非您明確地調用conn.commit(),否則在事務中完成的所有操作都將被撤消。但是,身份證號碼不會回滾,因此您會看到該行爲。

你有兩個選擇: 1)執行執行語句後明確承諾:

conn.commit() 

2)你的數據庫連接上啓用自動提交(創建光標前):

conn.autocommit = True 

你可以閱讀更多關於此的在http://pythonhosted.org/pg8000/quickstart.html#key-points

+0

我在想這個提交來自遊標,所以當我沒有看到文檔上的cursor.commit方法時,我想它默認是打開的。謝謝! – wmebane

+0

出於好奇,你知道爲什麼序列號會改變沒有提交? – wmebane