2012-01-17 41 views
4

我使用Django 1.2和1.3以及MySql後端。將Django數據庫後端從MySql更改爲PostgreSQL

一旦同時與南方遷移我的MySQL數據庫時收到一條錯誤消息:

! Error found during real run of migration! Aborting. 

! Since you have a database that does not support running 
! schema-altering statements in transactions, we have had 
! to leave it in an interim state between migrations. 
... 
! The South developers regret this has happened, and would 
! like to gently persuade you to consider a slightly 
! easier-to-deal-with DBMS 

我在想,如果我的遷移數據庫從MySQL到PostgreSQL可以防止此錯誤。其次,從MySql遷移到PostgreSQL將會更多地涉及到在MySql dbase上執行dumpdata,將設置更改爲指向PostgreSQL和新後端的加載數據?

我看到了this stackoverflow的問題,但它談到他的數據庫太大。我不認爲這將是我的數據庫的情況。我的Django項目中沒有任何自定義SQL命令。

+0

只是儘量在回答中給出的mysql2postgres http://stackoverflow.com/ a/8385094/540341 - 如果一切順利,則需要幾分鐘時間。您可以在遷移之前備份您的數據庫和配置以100%安全。 – filiprem 2012-01-17 14:22:58

+0

另一種選擇是留在MySQL上,但改變表InnoDB引擎。見http://stackoverflow.com/questions/4834415/does-djangos-south-migration-tool-work-for-innodb – filiprem 2012-01-17 14:26:09

+0

@filiprem,謝謝,這可能有效。我感興趣的是,如果專門遷移到PostgreSQL也會避免這種情況。我還有其他幾個想要遷移的原因。我閱讀了有關mysql2postgres的信息,如果簡單的dumpdata/loaddata出現問題,它將是一個很好的回退。 – 2012-01-17 15:08:08

回答

5

我厭倦了看到這個錯誤使用南,是的,切換到PostgreSQL已經放逐它!

上面評論中提到的用Ruby編寫的mysql2postgres應用程序並不適用於我(它會運行,輸出一些細節到屏幕,但不會複製任何數據行,對我來說)。不知道爲什麼。但很高興有這麼工作得十分完美的它一個Python重寫(對我來說,最終):
http://pypi.python.org/pypi/py-mysql2pgsql

我發現的唯一的疑難雜症是:

起初,我認爲這將是最安全的設置在表PostgreSQL數據庫通過syncdb,然後只遷移數據。我試過這個,但是這些表按字母順序進行遷移,這違反了某些表的外鍵約束(行與表中尚未導入的行有關)。

我接下來嘗試了一個結構+數據遷移。這遷移很好,但我後來在Django遇到了一些問題,特別是管理網站。似乎遷移腳本已經創建了一些與Django不同的表約束。

我解決了這個問題,通過黑客mysql2pgsql腳本來尊重yaml config only_tables屬性中給出的表的順序......然後執行syncdb +僅數據遷移。通過試驗和錯誤,我對我的遷移進行排序,直到它們全部導入成功。

UPDATE:
對上述被錄取了,所以你可以從主版本做到這一點,現在的黑客我拉請求:
https://github.com/philipsoutham/py-mysql2pgsql

+0

謝謝,這正是我需要的信息。我將嘗試你的成功遷移路線。 – 2012-01-19 22:44:09

+0

我目前正在部署此解決方案。它的工作原理,只有目前遇到的問題是這樣的:http://stackoverflow.com/questions/6466836/postgres-sequences-without-an-owned-by-attribute-do-not-return-an-id-in-django – 2012-04-02 19:00:33

相關問題