2013-05-06 59 views
0

我忙於在Grails項目上進行從MySQL到Postgres的相當複雜的數據遷移。Grails生成

我使用GORM在PostGres中生成模式,然後執行MySQL-> mysqldump,執行一些數據操作,然後導入到Postgres中。

很明顯,每個從MySQL到PSQL的人都認爲是id列上的auto_inc。其結果是,我已經添加了以下映射到每個域對象(根據不同的網站和引導指令),這應該管理所有的測序id列:

static mapping = { 
     id generator: 'sequence' 
}

但是做一個\ d +帳戶我看到下面的行:

 
public.product 
----------------------+-----------------------------+-----------+----------+- 
id     | bigint      | not null | plain | 

...這是有點不同,我所期望的(我希望它是一個串行或bigserial)。因此,無論如何,我都會遷移數據,然後啓動應用程序,然後通過/ product/create操作添加產品來測試。沒有骰子,我可以看到一個hibernate異常彈出,抱怨唯一的鍵(插入語句試圖使用2的一個id)。我刷新頁面幾次(使更多的失敗,但增加nextval),最終它得到到142(表中目前有141個產品),然後它成功了。顯然,我必須更新表中使用的每個id序列的nextval。很遺憾,我無法真正瞭解wtf Grails是作爲序列,因爲它沒有被表引用,在DB中也沒有任何新表。

我已閱讀(How to reset postgres' primary key sequence when it falls out of sync?)的提示,但由於沒有主鍵上的序列。

我可以使用min_lo值(if sequence方法甚至考慮非hilo策略的下界),但理想情況下,我希望能夠運行一些SQL來修復遷移後的情況。

乾杯。

編輯:PostGreSQL 9.1,Grails 2.0.3(是的,這將在遷移後更新)。

回答

1

請參閱此文檔。您必須在啓動應用程序之前更新序列。

http://www.postgresql.org/docs/9.1/static/functions-sequence.html

currval(regclass)     bigint Return value most recently obtained with nextval for specified sequence 
lastval()       bigint Return value most recently obtained with nextval for any sequence 
nextval(regclass)     bigint Advance sequence and return new value 
setval(regclass, bigint)   bigint Set sequence's current value 
setval(regclass, bigint, boolean) bigint Set sequence's current value and is_called flag 
+0

是,問題沒有更新序列(我給解決了這個鏈接),它實際上只是找到其中/序列實際上是如何存儲,如果不是在一個表中數據庫。 – Noxville 2013-05-07 07:40:57

+0

序列是數據庫對象。它們存儲在內存中。 – 2013-05-07 13:16:17