2010-06-19 70 views
13

我目前使用sqlite3作爲我的Django項目之一的數據庫。我想改變這個使用postgresql,我想保持所有的數據完好無損。加載datadump時將Django項目從sqlite3後端切換到postgresql失敗

我用./manage.py dumpdata > dump.json創建數據轉儲,並將我的設置更改爲使用postgresql。試着先用空數據庫做./manage.py loaddata dump.json導致表格不存在的錯誤,所以我跑./manage.py syncdb,並再次嘗試。導致此錯誤:

Problem installing fixture 'dump.json': Traceback (most recent call last): 
    File "/usr/lib/python2.6/site-packages/django/core/management/commands/loaddata.py", line 163, in handle 
    obj.save() 
    File "/usr/lib/python2.6/site-packages/django/core/serializers/base.py", line 163, in save 
    models.Model.save_base(self.object, raw=True) 
    File "/usr/lib/python2.6/site-packages/django/db/models/base.py", line 495, in save_base 
    rows = manager.filter(pk=pk_val)._update(values) 
    File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 448, in _update 
    return query.execute_sql(None) 
    File "/usr/lib/python2.6/site-packages/django/db/models/sql/subqueries.py", line 124, in execute_sql 
    cursor = super(UpdateQuery, self).execute_sql(result_type) 
    File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 2347, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/lib/python2.6/site-packages/django/db/backends/util.py", line 19, in execute 
    return self.cursor.execute(sql, params) 
IntegrityError: duplicate key value violates unique constraint "django_content_type_app_label_key" 
  • 這不是從一個數據庫將數據移動到另一個正確的方法是什麼?
  • 爲了安全地切換DB後端,我該怎麼做?
+0

我忽略了一些Django的表。 './manage.py dumpdata -e sessions -e admin -e contenttypes -e auth.Permission -e authtoken --natural> db.json'然後執行'./manage.py loaddata db.json'。也許它有助於某人。有關詳細信息,請參閱此問題http://stackoverflow.com/questions/853796/problems-with-contenttypes-when-loading-a-fixture-in-django – 2015-04-21 17:42:59

回答

27

問題在於你得到的內容類型定義了兩次 - 一次是當您執行syncdb時,一次是從您要導入的導出數據中執行。由於數據庫中的其他項目可能依賴於原始內容類型定義,因此我建議保留這些項目。

因此,在運行syncdb之後,請執行manage.py dbshell並在您的數據庫中執行TRUNCATE django_content_type;以刪除所有新定義的內容類型。那麼在任何情況下,您都不應該在過程的這一部分發生任何衝突。

+0

謝謝,這似乎已經做了伎倆..現在我需要搞清楚,爲什麼python解釋器在做涉及django-tagging的查詢時轉儲核心... – Epcylon 2010-06-19 23:22:13

+17

在我的情況下,postgres抱怨說由於外鍵約束它不能執行截斷,並且建議添加可以工作的CASCADE參數。所以:「TRUNCATE django_content_type CASCADE;」 – shacker 2012-06-15 01:50:48

+0

在我的情況下,我不得不''TRUNCATE django_content_type CASCADE;'但它工作得很好! – Hardest 2016-10-04 09:13:37

2

有關於Django ticket 7052的大討論。現在正確的方法是使用--natural參數,例如:./manage.py dumpdata --natural --format=xml --indent=2 > fixture.xml

爲了--natural與您的模型工作,他們必須實現natural_keyget_by_natural_key,作爲the Django documentation regarding natural keys描述。

話雖如此,你可能仍然需要編輯數據之前導入./manage.py loaddata。例如,如果您的應用程序發生更改,則syncdb將填充表django_content_type,並且您可能希望在加載之前從xml文件中刪除相應條目。

0

這對我有效。您可能希望確保服務器已停止,以免丟失新數據。轉儲:

$ python manage.py dumpdata --exclude auth.permission --exclude contenttypes --natural > db.json 

確保您的機型沒有信號(例如post_save)或任何創建模型。如果你這樣做,暫時評論一下。

編輯settings.py以指向新的數據庫,並將其設置:

$ python manage.py syncdb 

$ python manage.py migrate 

加載數據:

./manage.py loaddata db.json 
相關問題