中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

將Django使用的數據庫從MySQL遷移到PostgreSQL的教程
來源:易賢網 閱讀:1044 次 日期:2015-04-14 15:32:07
溫馨提示:易賢網小編為您整理了“將Django使用的數據庫從MySQL遷移到PostgreSQL的教程”,方便廣大網友查閱!

我們已對 Django1.6 app完成了數據庫從mysql到PostgreSQL的遷移,如果你的環境很干凈,這個過程就會很簡單,只要允許syncdb 或者 migrate創建表,truncating表中的數據,然后運行dumpdata 和loaddatamanagement命令就完成了。

第一步,在你的PostgreSQL數據庫中創建一個空的實例:

?1 CREATE DATABASE dbname OWNER rolename;

第二步,在你的Django中給創建的數據庫加上配置

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

?123456789101112131415161718 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實例中創建表

?1 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就可以了。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
主站蜘蛛池模板: 沈阳市| 桂平市| 报价| 鹿邑县| 合作市| 昭觉县| 上饶市| 重庆市| 广河县| 闻喜县| 德昌县| 佛教| 沙湾县| 当涂县| 清河县| 呼伦贝尔市| 尉犁县| 岳西县| 长沙市| 孟津县| 松滋市| 安多县| 营山县| 铜梁县| 西华县| 文登市| 宣恩县| 探索| 津南区| 镇平县| 寿阳县| 新干县| 宁武县| 慈溪市| 丰原市| 通渭县| 安多县| 甘泉县| 英超| 大连市| 重庆市|