django syncdb và một mô hình được cập nhật


86

Gần đây tôi đã cập nhật mô hình của mình, thêm BooleanField vào nó nhưng khi tôi làm vậy python manage.py syncdb, nó không thêm trường mới vào cơ sở dữ liệu cho mô hình. Làm thế nào tôi có thể sửa lỗi này ?


17
Thực tế là Django không hỗ trợ một thứ cơ bản như vậy khiến tôi không thể sử dụng nó để tạo ra các mô hình. Việc họ coi một ORM xử lý việc tạo bảng nhưng không sửa đổi bảng (tại chỗ) là chất lượng phát hành gần như khiến tôi không sử dụng Django hoàn toàn.
Glenn Maynard

3
Thực tế là Django cho phép khả năng cắm ứng dụng tuyệt vời như vậy làm cho Django trở nên tuyệt vời và cho thấy việc thiếu hỗ trợ tích hợp để sửa đổi bảng về cơ bản là không liên quan. Cài đặt một ứng dụng khó đến mức nào?
Dominic Rodger

@Glenn, lập kế hoạch mô hình của bạn đúng cách trong giai đoạn thiết kế của bạn và bạn sẽ không gặp vấn đề này. Nếu bạn đang thêm các tính năng mới thì hãy sử dụng bộ ứng dụng di chuyển như South. Di cư tại chỗ thường phức tạp; quá phức tạp đối với một lệnh quản lý Django đơn giản.
Soviut

Câu trả lời:


100

Từ Django 1.7 trở đi

Django đã tích hợp sẵn hỗ trợ cho việc di chuyển - hãy xem tài liệu .

Đối với Django 1.6 trở về trước

Django không hỗ trợ di chuyển ra khỏi hộp. Có một ứng dụng có thể cắm được cho Django thực hiện chính xác điều đó và nó hoạt động rất tốt. Nó được gọi là Nam .


1
Lưu ý: Tôi đã gặp sự cố khi sử dụng South để di chuyển các mô hình với phần phụ trợ db tùy chỉnh (như django-mssql)
Don

1
Nam là rất tốt đẹp! Cảm ơn vì mẹo
Julien Greard

14

Django hiện không tự động làm điều này. Tùy chọn của bạn là:

  1. Bỏ bảng khỏi cơ sở dữ liệu, sau đó tạo lại nó ở dạng mới bằng syncdb.
  2. In SQL cho cơ sở dữ liệu bằng cách sử dụng python manage.py sql (appname), tìm dòng đã thêm cho trường và thêm nó theo cách thủ công bằng alter tablelệnh SQL. (Điều này cũng sẽ cho phép bạn chọn các giá trị của trường cho các bản ghi hiện tại của bạn.)
  3. Sử dụng South (theo câu trả lời của Dominic ).

11

Làm theo các bước sau:

  1. Xuất dữ liệu của bạn vào một vật cố sử dụng dumpdata lệnh quản lý
  2. Bỏ bàn
  3. Chạy syncdb
  4. Tải lại dữ liệu của bạn từ cố định bằng lệnh quản lý dữ liệu tải

Một lần thả và tải lại hoàn toàn cho một cái gì đó nên được thực hiện tại chỗ? Đó là khủng khiếp.
Glenn Maynard

3
Đây là một lệnh quản lý đơn giản, không phải là một bộ di chuyển! Django không có cách nào dự đoán được dữ liệu của bạn đã thay đổi như thế nào hoặc làm thế nào để bảo quản nó, vì vậy nó khăng khăng rằng bạn phải tự mình làm điều đó. Nếu bạn không thích nó, hãy sử dụng một công cụ di chuyển như South.
Soviut

8

Như đã đề cập trong câu trả lời đầu, tôi đã cố gắng sử dụng Nam , và sau một giờ thất vọng với lỗi di chuyển tối nghĩa quyết định đi với Django tiến hóa để thay thế.

Tôi nghĩ nó dễ bắt đầu hơn South và nó hoạt động hoàn hảo ngay lần đầu tiên tôi gõ ./manage.py evolve --hint --execute, vì vậy tôi hài lòng với nó.


7
Sau khi sử dụng Django Evolution và South gần một năm, tôi đang thay đổi quan điểm của mình. Nam thật tuyệt vời. Nhưng nó rất giống Git theo nghĩa bạn phải đảm bảo rằng bạn thực sự hiểu cách hoạt động của nó . Nếu bạn đang nhập lệnh một cách mù quáng, rất có thể bạn sẽ gặp rắc rối trong lần đầu tiên bạn hoặc ai đó trong nhóm của bạn mắc lỗi.
Dan Abramov

2

Havent đã sử dụng django trong một thời gian, nhưng tôi dường như nhớ rằng syncdb thực hiện các lệnh thay đổi trên bảng db. bạn phải thả bảng sau đó chạy lại và nó sẽ tạo lại.

chỉnh sửa: xin lỗi KHÔNG thực hiện thay đổi.


Sau đó, nó không chạy alter tablecác lệnh, nó đang chạy create tablecác lệnh.
Dominic Rodger

Tôi có dữ liệu trong db nên sẽ thật tuyệt nếu tôi khắc phục được vấn đề này mà không bị rớt.
Hellnar

1
Tôi nghĩ bạn muốn nói rằng syncdb KHÔNG thực hiện các lệnh thay đổi. Bạn không phải bỏ bảng, bạn cũng có thể thêm trường mới vào sql của mình theo cách thủ công.
Odif Y Regiaeb 22/10/09

có nhưng câu hỏi đề cập đến việc sử dụng syncdb, vì vậy trong trường hợp này, bạn sẽ phải bỏ bảng để sử dụng syncdb hoặc sử dụng plugin được đề cập bên dưới.
Alex H

1
Nếu bạn đang chán nản với South, hãy thử Django Evolution. Làm việc tốt cho tôi. stackoverflow.com/questions/1605662/…
Dan Abramov

1

Trong django 1.6

  • Lúc đầu, chúng tôi đã chạy - python manage.py sql <app name>

  • Sau đó chúng ta phải chạy - python manage.py syncdb


0

Nếu bạn chạy Django với Apache và MySQL, hãy khởi động lại apache sau khi thực hiện di chuyển với makemigrations .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.