將Django與PostgreSQL(8.x)後端結合使用,我有一個需要跳過一個ID塊的模型。在給出49999之後,我希望下一個ID是70000而不是50000(因爲該塊是保留給其他實例用ID明確添加的源的 - 我知道這不是一個好設計,但這是我必須使用的)。如何安全地在Django中轉發主鍵序列?
這樣做的正確/最安全的地方是什麼?
我知道我可以設置與
SELECT SETVAL(
(SELECT pg_get_serial_sequence('myapp_mymodel', 'id')),
70000,
false
);
但什麼時候Django的實際拉從時序的編號序列? 難道我重寫MyModel.save(),調用其超,然後搶我的光標,並與
SELECT currval(
(SELECT pg_get_serial_sequence('myapp_mymodel', 'id'))
);
檢查?
我相信,即使保存模型失敗,django也可以提前執行一個序列,所以我想確保每當它遇到它前進的數字時 - 是否比save()有更好的地方?
P.S .:即使這是要走的路 - 我真的可以弄清楚save()會話的currval嗎?如果我抓住連接和遊標,並執行第二條SQL語句,我是不是在另一個會話中,因此不會得到一個currval?
謝謝你的任何指針。
編輯:我有一種感覺,這必須在數據庫級別上進行(併發性問題),並公佈了相應的PostgreSQL的問題 - How can I forward a primary key sequence in PostgreSQL safely?
爲什麼不直接在數據庫上手動運行並使用它?試圖通過Django的方式來實現它在id爲49999的實際實例上,這樣做更值得。如果id在70000之後纔是安全的,那麼這就是你應該開始的地方。 – 2012-02-16 15:49:10
我同意克里斯。這聽起來像任何這樣的代碼也是一個測試的痛苦。 – 2012-02-16 19:34:07
手動運行的問題在於,當發生這種情況時,我必須這樣做。有不止一個差距。它們是由兩個不同系統(在線/離線)發出的數字,但最終在同一個數據庫中。交替的塊。 – 2012-02-17 02:11:02