2009-12-31 33 views
66

Tôi đã xác định một mô hình và tạo cơ sở dữ liệu được liên kết qua manager.py syncdb. Bây giờ tôi đã thêm một số trường vào mô hình, tôi đã thử lại syncdb, nhưng không xuất hiện. Khi cố truy cập các trường mới này từ các mẫu của tôi, tôi nhận được ngoại lệ "Không có cột", dẫn tôi tin rằng syncdb không thực sự cập nhật cơ sở dữ liệu. Lệnh đúng ở đây là gì?cập nhật cơ sở dữ liệu django để phản ánh các thay đổi trong các mô hình hiện có

+1

Bạn nên thay đổi câu trả lời được chấp nhận. – User

Trả lời

33

Có vẻ như những gì bạn cần là một hệ thống di chuyển. South thực sự tốt đẹp, hoạt động tốt, có một số công cụ tự động hóa để giảm bớt công việc của bạn. Và có một số lớn tutorial.


lưu ý: syncdb không thể cập nhật bảng hiện có của bạn. Đôi khi không thể quyết định phải làm gì một cách tự động - đó là lý do tại sao các kịch bản phía nam là tuyệt vời.

+6

cảm ơn vì đã chỉ ra công cụ thú vị này. Đối với bất cứ ai quan tâm, có một cuộc thảo luận sâu sắc về di chuyển cơ sở dữ liệu django ở đây: http://code.djangoproject.com/wiki/SchemaEvolution – theactiveactor

+0

Liên kết của Nam cho thấy, "Nam đã không được chấp nhận. Từ Django 1.7 trở lên, di cư được tích hợp vào cốt lõi của Django. Nếu bạn đang chạy phiên bản trước, bạn có thể tìm thấy kho lưu trữ trên BitBucket. ". Giờ thì sao? – FaithReaper

+0

liên kết trong câu trả lời bị hỏng –

3

deseb là công cụ tuyệt vời cho điều đó.

Sau khi cài đặt, bạn có thể viết ./manage.py sqlevolve và nó sẽ tạo các lệnh sql cần thiết để giữ cấu trúc cơ sở dữ liệu đồng bộ với các mô hình của bạn.

+0

Điều này trông giống như những gì tôi cần. Sqlevolve có cam kết thay đổi không? – theactiveactor

2

Bạn cần phải thả bảng của mình trước khi có thể tạo lại chúng với syncdb.

Nếu bạn muốn giữ lại dữ liệu hiện có, bạn cần phải tải xuống cơ sở dữ liệu, thả bảng, chạy syncdb để tạo cơ sở dữ liệu mới, sau đó tải lại dữ liệu cũ của bạn vào bảng mới.

Có các công cụ trợ giúp việc này. Tuy nhiên, trong nhiều trường hợp, nó chỉ là dễ dàng để làm điều đó bằng tay.

8

Syncdb của Django không thay đổi các bảng hiện có trong cơ sở dữ liệu, do đó bạn phải thực hiện thủ công. Cách tôi luôn làm là:

  1. Thay đổi lớp mô hình trước.
  2. Sau đó chạy: manage.py sql myapp.
  3. Nhìn vào sql nó in ra và xem làm thế nào nó đại diện cho sự thay đổi bạn sẽ thực hiện.
  4. Thực hiện thay đổi theo cách thủ công bằng trình quản lý cơ sở dữ liệu của bạn.
  5. Kiểm tra xem mọi thứ có hoạt động chính xác không bằng cách sử dụng trang quản trị.

Nếu bạn đang sử dụng sqllite một người quản lý tốt là plugin firefox: link

+0

Tôi thực sự nghĩ đây là giải pháp tốt nhất và dễ nhất – shrimpwagon

8

công cụ khác sẽ được tiến hóa django. Không có bảng rơi cần thiết trong hầu hết các trường hợp.

django evolution

Chỉ cần cài đặt nó như bất kỳ ứng dụng django khác và chạy:

python manage.py tiến hóa --hint --execute

137

As of Django 1.7+, built-in migrations support , allows for database schema migrations that preserve data. That's probably a better approach than the solution below.

Một lựa chọn khác, không đòi hỏi các ứng dụng bổ sung, là sử dụng các hàm manage.py được xây dựng để xuất dữ liệu của bạn, xóa cơ sở dữ liệu và khôi phục dữ liệu đã xuất.

Các phương pháp bên dưới sẽ cập nhật bảng cơ sở dữ liệu cho ứng dụng của bạn, nhưng sẽ hoàn toàn phá hủy mọi dữ liệu đã tồn tại trong các bảng đó. Nếu các thay đổi bạn đã thực hiện đối với mô hình ứng dụng không phá vỡ lược đồ cũ của mình (ví dụ: bạn đã thêm trường tùy chọn mới), bạn có thể chỉ cần đổ dữ liệu trước và tải lại sau đó, như sau:

Django 1.4.15 và trước đó

python manage.py dumpdata <your_app> > temp_data.json 
python manage.py reset <your_app> 
python manage.py loaddata temp_data.json 

Django 1.5 và mới hơn

python manage.py dumpdata <your_app> > temp_data.json 
python manage.py sqlclear <your_app> | python manage.py dbshell 
python manage.py syncdb 
python manage.py loaddata temp_data.json 

(lệnh reset đã bị phản đối và sau đó loại bỏ trong Django 1.5)

Nếu các thay đổi của bạn phá vỡ lược đồ cũ của bạn, điều này sẽ không hoạt động - trong trường hợp các công cụ như South hoặc Django Evolution thật tuyệt vời.

+0

Cảm ơn vì điều này. Chỉ cần những gì tôi đang tìm kiếm. –

+0

Tôi nghĩ giải pháp này là tốt nhất. –

+0

cảm ơn, giải pháp tốt nhất :) –

1

Đối với phiên bản 1.4.1 và người sử dụng trên các lệnh đã thay đổi để

python manage.py flush 

Hãy đọc official document trước khi sử dụng nó như là nó sẽ xóa tất cả dữ liệu của bạn.

+0

Những gì tôi không hiểu là tuôn ra thực sự đặt lại cơ sở dữ liệu như sau khi' syncdb' được thực hiện, nhưng những gì về các trường mới được thêm vào ? Chúng không được tạo ra –

33

Kể từ Django 1.7, giờ đây bạn có thể thực hiện việc này với di chuyển gốc. Chỉ cần chạy

python manage.py makemigrations <your app name> 
python manage.py migrate 
Các vấn đề liên quan