Cách dễ nhất để xóa một cơ sở dữ liệu khỏi CLI với management.py trong Django là gì?


83

Tôi đang sử dụng Django để xây dựng trang web với MySQL. Vì tôi đang học nên tôi cần phải thay đổi Mô hình rất thường xuyên vì vậy tôi muốn tất cả các bảng được xóa và bảng mới được tạo.

Nhưng syncdbkhông chạm vào các bảng hiện có. Có cách nào tốt hơn để xử lý vấn đề này không?

Câu trả lời:


152

Nếu bạn không quan tâm đến dữ liệu:

Cách tốt nhất là bỏ cơ sở dữ liệu và chạy syncdblại. Hoặc bạn có thể chạy:

Đối với Django> = 1.5

python manage.py flush

Đối với Django <1,5

python manage.py reset appname

(bạn có thể thêm --no-inputvào cuối lệnh để bỏ qua lời nhắc tương tác.)

Nếu bạn quan tâm đến dữ liệu:

Từ các tài liệu:

syncdb sẽ chỉ tạo bảng cho các mô hình chưa được cài đặt. Nó sẽ không bao giờ đưa ra các câu lệnh ALTER TABLE để khớp với các thay đổi được thực hiện đối với một lớp mô hình sau khi cài đặt. Các thay đổi đối với các lớp mô hình và lược đồ cơ sở dữ liệu thường liên quan đến một số hình thức mơ hồ và trong những trường hợp đó, Django sẽ phải đoán đúng những thay đổi cần thực hiện. Có nguy cơ dữ liệu quan trọng sẽ bị mất trong quá trình này.

Nếu bạn đã thực hiện các thay đổi đối với một mô hình và muốn thay đổi các bảng cơ sở dữ liệu cho phù hợp, hãy sử dụng lệnh sql để hiển thị cấu trúc SQL mới và so sánh cấu trúc đó với lược đồ bảng hiện có của bạn để tìm ra các thay đổi.

https://docs.djangoproject.com/en/dev/ref/django-admin/

Tham khảo: FAQ - https://docs.djangoproject.com/en/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database

Mọi người cũng giới thiệu Nam ( http://south.aeracode.org/docs/about.html#key-features ), nhưng tôi chưa thử.


4
South thực sự rất tốt để tự động xử lý các cuộc di cư. Mất một chút thời gian để làm quen, nhưng nó giúp tiết kiệm rất nhiều rắc rối khi đánh rơi và tạo lại cơ sở dữ liệu trong quá trình phát triển và là điều bắt buộc phải có khi trang web của bạn hoạt động và bạn cần thay đổi cấu trúc db khi bạn có dữ liệu quý giá trong đó.
thepeer

11
ĐẶT LẠI LỆNH ĐÃ KHÔNG ĐƯỢC ĐẶT LẠI . Trong Django 1.5, lệnh đã được cập nhật thành flush. thử sử dụng python manage.py flushhoặc python manage.py flush --noinputbỏ qua lời nhắc tương tác.
agconti,

South đã không được chấp nhận . Tham khảo tại đây . Và liên kết bạn đưa ra ở đây đã bị hỏng.
Mukesh Sai Kumar

Có vẻ như lệnh bây giờ django-admin flushtheo tài liệu
Todd

4

Sử dụng Tiện ích mở rộng Django , đang chạy:

./manage.py reset_db

Sẽ xóa các bảng cơ sở dữ liệu, sau đó chạy:

./manage.py syncdb

Sẽ tạo lại chúng (phía nam có thể yêu cầu bạn di chuyển mọi thứ).


2
@becko thực thi điều này đầu tiên: pip install django-extensions
FacePalm

4

Tôi nghĩ tài liệu Django đề cập rõ ràng rằng nếu mục đích là bắt đầu lại từ một DB trống (có vẻ là ý định của OP), thì chỉ cần thả và tạo lại cơ sở dữ liệu và chạy lại migrate(thay vì sử dụng flush):

Nếu bạn muốn bắt đầu từ một cơ sở dữ liệu trống và chạy lại tất cả các lần di chuyển, bạn nên bỏ và tạo lại cơ sở dữ liệu rồi chạy di chuyển thay thế.

Vì vậy, đối với trường hợp của OP, chúng ta chỉ cần:

  1. Bỏ cơ sở dữ liệu khỏi MySQL
  2. Tạo lại cơ sở dữ liệu
  3. Chạy python manage.py migrate

0

Nhanh nhất (giảm và tạo tất cả các bảng bao gồm dữ liệu):

./manage.py reset appname | ./manage.py dbshell

Thận trọng:

  • Có thể không hoạt động trên Windows một cách chính xác.
  • Có thể giữ một số bảng cũ trong db

3
resetđã chạy SQL, vì vậy không cần phải chuyển đến dbshell. Nếu bạn sử dụng sqlresetlệnh, thì điều đó sẽ chỉ in ra SQL, mà bạn có thể chuyển đến trình bao để thực thi, nhưng đó là một bước không cần thiết.
Michael Mior

0

Bạn có thể sử dụng thư viện Django-Truncate để xóa tất cả dữ liệu của bảng mà không phá hủy cấu trúc bảng.

Thí dụ:

  1. Trước tiên, cài đặt django-turncate bằng terminal / dòng lệnh của bạn:
pip install django-truncate
  1. Thêm "django_truncate" vào INSTALLED_APPS của bạn trong settings.pytệp:
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. Sử dụng lệnh này trong thiết bị đầu cuối của bạn để xóa tất cả dữ liệu của bảng khỏi ứng dụng.
python manage.py truncate --apps app_name --models table_name
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.