2010-06-19 20 views
13

Tôi hiện đang sử dụng sqlite3 làm DB cho một trong các dự án Django của tôi. Tôi muốn thay đổi điều này để sử dụng postgresql, và tôi muốn giữ nguyên tất cả dữ liệu.Chuyển dự án Django từ phần phụ trợ sqlite3 sang postgresql không thành công khi tải datadump

Tôi đã sử dụng ./manage.py dumpdata > dump.json để tạo một kết xuất dữ liệu và thay đổi cài đặt của mình để sử dụng postgresql. Trước tiên, hãy thử với một cơ sở dữ liệu trống để làm ./manage.py loaddata dump.json dẫn đến lỗi về các bảng không tồn tại, vì vậy tôi đã chạy ./manage.py syncdb và thử lại. Điều đó dẫn tới lỗi này:

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" 
  • Đây có phải là không cách chính xác để di chuyển dữ liệu từ một cơ sở dữ liệu khác?
  • Tôi nên làm gì để chuyển đổi phần phụ trợ DB một cách an toàn?
+0

tôi bỏ qua một số bảng django. './manage.py dumpdata -e sessions -e quản trị -e contenttypes -e auth.Permission -e authtoken --natural> db.json' và sau đó đã làm' ./manage.py loaddata db.json'. Có lẽ nó giúp ai đó. Để biết chi tiết, hãy xem câu hỏi này http://stackoverflow.com/questions/853796/problems-with-contenttypes-when-loading-a-fixture-in-django –

Trả lời

27

Vấn đề đơn giản là bạn nhận được các loại nội dung được xác định hai lần - một lần khi bạn thực hiện syncdb và một lần từ dữ liệu đã xuất bạn đang cố gắng nhập. Vì bạn có thể có các mục khác trong cơ sở dữ liệu của bạn phụ thuộc vào định nghĩa kiểu nội dung gốc, tôi khuyên bạn nên giữ các mục đó.

Vì vậy, sau khi chạy syncdb, hãy manage.py dbshell và trong cơ sở dữ liệu của bạn làm TRUNCATE django_content_type; để xóa tất cả các loại nội dung mới được xác định. Sau đó, bạn không nên có bất kỳ mâu thuẫn nào - về phần đó của quy trình, trong mọi trường hợp.

+0

Cảm ơn, điều này dường như đã thực hiện thủ thuật .. bây giờ tất cả những gì tôi cần để tìm ra, là lý do tại sao trình thông dịch python đổ lõi khi thực hiện một truy vấn liên quan đến việc gắn thẻ django ... – Epcylon

+17

Trong trường hợp của tôi, postgres phàn nàn rằng nó không thể thực hiện cắt ngắn do ràng buộc khóa ngoại, và đề nghị thêm đối số CASCADE, mà làm việc. Vì vậy: "TRUNCATE django_content_type CASCADE;" – shacker

+0

Trong trường hợp của tôi, tôi đã phải 'TRUNCATE django_content_type CASCADE;' nhưng nó hoạt động rất tốt! – Hardest

2

Có một cuộc thảo luận lớn về nó trên Django ticket 7052. Cách ngay bây giờ là sử dụng --natural tham số, ví dụ: ./manage.py dumpdata --natural --format=xml --indent=2 > fixture.xml

Để --natural để làm việc với các mô hình của bạn, họ phải thực hiện natural_keyget_by_natural_key, như mô tả trên the Django documentation regarding natural keys.

Có nói rằng, bạn vẫn có thể cần chỉnh sửa dữ liệu trước khi nhập dữ liệu với ./manage.py loaddata. Ví dụ, nếu các ứng dụng của bạn thay đổi, syncdb sẽ điền vào bảng django_content_type và bạn có thể muốn xóa các mục nhập tương ứng khỏi tệp xml trước khi tải nó.

0

Điều này phù hợp với tôi. Bạn có thể muốn đảm bảo máy chủ bị dừng để không có dữ liệu mới bị mất. Dump it:

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

Đảm bảo mô hình của bạn không có tín hiệu (ví dụ: post_save) hoặc bất kỳ thứ gì tạo mô hình. Nếu bạn làm thế, hãy bình luận nó ngay lập tức.

Sửa settings.py để trỏ đến cơ sở dữ liệu mới và thiết lập nó:

$ python manage.py syncdb 

$ python manage.py migrate 

tải dữ liệu:

./manage.py loaddata db.json 
Các vấn đề liên quan