將Django使用的資料庫從MySQL遷移到PostgreSQL的教程_python

來源:互聯網
上載者:User

我們已對 Django1.6 app完成了資料庫從mysql到PostgreSQL的遷移,如果你的環境很乾淨,這個過程就會很簡單,只要允許syncdb 或者 migrate建立表,truncating表中的資料,然後運行dumpdata 和loaddatamanagement命令就完成了。
第一步,在你的PostgreSQL資料庫中建立一個空的執行個體:
 

CREATE DATABASE dbname OWNER rolename;

第二步,在你的Django中給建立的資料庫加上配置

在setting.py 中,我們這樣配置:
 

DATABASES = {  'default': {    'ENGINE': 'django.db.backends.mysql',    'NAME': 'dbname',    'USER': 'dbuser',    'PASSWORD': 'dbpass',    'HOST': 'mysql.example.com',    'PORT': '',  },  'postgresql': {    'ENGINE': 'django.db.backends.postgresql_psycopg2',    'NAME': 'dbname',    'USER': 'dbuser',    'PASSWORD': 'dbpass',    'HOST': 'postgresql.example.com',    'PORT': '',  }}

這樣我們就指定了以後名稱操作的是哪個資料庫。
第三步,在PostgreSQL執行個體中建立表

python manage.py syncdb --migrate --no-initial-data --database=postgresql

在PostgreSQL中運行syncdb 和 migrations,這個過程並沒有初始資料。
第四步,truncate新建立的表

儘管我們在先前的步驟中指定了 –no-initial-data ,為了防止在遷移過程中使用者的自訂資料在未知情況下加入了表中,我們最好還是truncate一下建立的表,我們可以產生一個SQL指令碼,運行:
 

python manage.py sqlflush --database=postgresql
第五步,從mysql中備份資料到JSON 檔案中

Django 有一個dumpdata命令,用它可以產生一個資料庫無關的備份,預設格式是JSON。
 

python manage.py dumpdata --all --natural --indent=4 > dbname.json

這裡的 -all 參數是為了確保你在匯出資料的過程中有可能有你自己的過濾和修改資料的需求,-natural 參數告訴Django使用natural keys(如果可用的話) –indent 參數是為了使輸出更加可讀。

你也許想只匯出特定的apps裡的資料,或者只匯出一個celery logs ,這樣的話,你就可以使用 –exclude參數,例如:

python manage.py dumpdata --all --natural --exclude=djcelery --exclude=search.SearchLog --indent=4 > dbname.json

第六步,載入JSON資料到PostgreSQL資料庫中
 

python manage.py loaddata dbname.json --database=postgresql

基本上遷移的過程就結束了,現在你只要修改一下你的資料庫配置,然後是PostgerSQL成為預設的資料庫。
 

DATABASES = {  'default': {    'ENGINE': 'django.db.backends.postgresql_psycopg2',    'NAME': 'dbname',    'USER': 'dbuser',    'PASSWORD': 'dbpass',    'HOST': 'postgresql.example.com',    'PORT': '',  }}

在我們的情況下,我們的資料庫不是很乾淨,我們的資料庫是給一個PHP的遺留代碼建立的,我們現在還在一步步擺脫它,我們有一些Django之外的資料庫,並且都在被程式使用,為了把這些遷移到PostgreSQL中,我使用了這個工具,過程還是簡單一些。
注意事項
Django 訊號

你可能想禁止這些,當一個資料庫記錄建立的時候,你的程式可能就會發送給你的用過郵件,為了不打擾它們,在載入資料的時候,你需要保證它們被禁止了,Here's one way to handle this 這裡我們使用了檢測器保證訊號不會別觸發。
約束(像非空,unique 和外鍵)

我們的資料庫遷移過程碰到了很多這種問題,比如一個外鍵約束,但是其他的一個表不存在了,有一下空置的記錄,但是模型定義中不允許,比如複製的過程中存在unique約束,這些都需要手動幹預,我必須使用SQL語句清除掉這些,Dumpdata 和loaddata 將會檢測到這些,所以你的資料庫必須是一個乾淨的一致的狀態。

主鍵的寫入程式碼

這很痛苦,因為在我們的測試 suite中,到處都是主鍵的寫入程式碼,所以很多測試到失敗了,因為使用PostgreSQL 處理的序列的方法和mysql不太一樣,我必須手動修改700多個測試案例,大都是很簡單的修改但是很消耗時間。

原生SQL語句

幸運的是,我們只有一處使用了原生sql語句,有些mysql中的函數在PostgreSQL中不適用,我們只用修改為在PostgreSQl中相同功能的函數就可以了。

大小寫敏感

字串比較在PostgreSQL中是大小寫敏感的,但是在Mysql中不是,我在遷移非Django資料表過程中也遇到了一些問題,索引建立的時候,命令需要id,但是欄位的名字是Id(字母I),我只要重新命名為id就可以了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.