2010-02-18 58 views
44

Tôi đã tạo mô hình và chạy python manage.py syncdb. Tôi nghĩ rằng đã tạo ra một bảng trong db. Sau đó, tôi nhận ra rằng tôi đã tạo một cột không chính xác, vì vậy tôi đã thay đổi nó và chạy cùng một lệnh, nghĩ rằng nó sẽ thả bảng cũ và thêm một cái mới.Làm cách nào để thả bảng từ SQLite3 trong DJango?

Sau đó, tôi đã đi đến python manage.py shell, và cố gắng chạy .objects.all(), và nó không thành công, nói rằng cột không tồn tại.

Tôi muốn xóa bảng cũ và sau đó chạy lại syncdb, nhưng tôi không thể tìm ra cách thực hiện điều đó.

+1

Đây là theo thiết kế. Việc đồng bộ hóa các thay đổi và giọt sẽ mở ra một loại giun khổng lồ. George có câu trả lời đúng cho bạn. – Alex

+1

Ofri có câu trả lời hay hơn –

Trả lời

38

Một cách đơn giản khác để thực hiện việc này khi sử dụng Django 1.4 trở xuống, sẽ là

python manage.py reset app_name 

sẽ giảm và tạo lại các bảng được sử dụng bởi các mô hình của ứng dụng này.

này đã bị phản đối trong Django 1.3 và không còn có sẵn từ Django 1,5

+0

Đây là giải pháp tôi đã sử dụng. Làm việc hoàn hảo. – Alex

+0

sooo hạnh phúc tôi chỉ tìm thấy điều này. cảm ơn bạn – teewuane

+2

"đặt lại lệnh không xác định" – user798719

26

có được những điều khoản về thả với

python manage.py sqlclear app_name

sau đó thử

python manage.py dbshell

và thực hiện câu lệnh DROP

séc ra http://docs.djangoproject.com/en/dev/ref/django-admin/

+0

Đây là câu trả lời tôi đã tìm ra ở đó. Cảm ơn bạn. Nó xảy ra rằng lệnh reset đã hoạt động tốt. – Alex

+0

điều này không hoạt động cho SQLite3 vì nó không có dbshell – rodling

67

để xóa ra khỏi một ứng dụng đơn giản như viết:

./manage.py sqlclear app_name | ./manage.py dbshell 

sau đó để xây dựng lại bảng của bạn chỉ cần gõ:

./manage.py syncdb 
+1

+1 Đẹp, công trình tuyệt vời – cevaris

+0

cuối cùng đã nhận được giải pháp. Cảm ơn – ashim888

+2

Không còn hoạt động ở Django 1.9+: [Khấu hao ở Django 1.9] (https://docs.djangoproject.com/en/1.9/internals/deprecation/#deprecation-removed-in-1-9) – prokaktus

28

Không có câu trả lời nào cho thấy cách xóa chỉ một bảng trong ứng dụng. Nó không quá khó. Lệnh dbshell ghi nhật ký người dùng vào trong trình bao sqlite3.

python manage.py dbshell 

Khi bạn ở trong trình bao, nhập lệnh sau để xem cấu trúc cơ sở dữ liệu của bạn. Điều này sẽ cho bạn thấy tất cả các tên bảng trong cơ sở dữ liệu (và cũng có các tên cột trong bảng).

SELECT * FROM sqlite_master WHERE type='table'; 

Nói chung, bảng tên Django theo quy ước sau: "appname_modelname". Do đó, truy vấn SQL hoàn thành mục tiêu của bạn sẽ trông giống như sau:

DROP TABLE appname_modelname; 

Điều này là đủ, ngay cả khi bảng có mối quan hệ với các bảng khác. Bây giờ bạn có thể đăng xuất khỏi vỏ SQLITE bằng cách thực hiện:

.exit 

Nếu bạn chạy lại syncdb, Django sẽ xây dựng lại bảng theo mô hình của bạn. Bằng cách này, bạn có thể cập nhật các bảng cơ sở dữ liệu của mình mà không làm mất tất cả dữ liệu ứng dụng. Nếu bạn đang chạy vào vấn đề này rất nhiều, hãy xem xét việc sử dụng South - một ứng dụng django sẽ di chuyển các bảng của bạn cho bạn.

+0

YOu có các nguyên tắc cơ bản-bằng chứng hơn phiên bản trả lời ở đây. Tôi sẽ chỉ cần thêm bạn cần phải cài đặt sqlite3. – Arcturus

+0

Cảm ơn bạn rất nhiều vì đã đề cập đến 'dbshell' - tôi đã sử dụng 'shell' trước đây, nhưng sau khi hoán đổi DB cho mysql, nó dường như không cho phép tôi truy cập vào các mô hình của tôi nữa. Bây giờ, 'dbshell' cắm tôi vào vỏ mysql của tôi - rất tuyệt. – natureminded

+0

Từ câu trả lời của Schdiewie Kay: sau khi bạn làm theo tất cả các bước trên, hãy chạy "manage.py migrate --run-syncdb" thay vì "syncdb" cho Django 1.9+ – NFern

15

Tôi cũng gặp vấn đề tương tự.

Đối với một quyết tâm nhanh chóng (nếu bạn không quan tâm về việc mất bảng của bạn/data), chỉnh sửa tệp tin models.py của bạn với các kiểu dữ liệu mong muốn, xóa các thư mục và file Migration db.SQLite3,

sau đó tái chạy các lệnh sau:

  1. python manage.py di chuyển
  2. makemigrations python manage.py
  3. python manage.py di chuyển
  4. python manage.py tạo uperuser (để tạo một tài khoản admin/pswd để quản lý trang admin)
  5. python manage.py runserver
+0

Đây là giải pháp duy nhất tôi có thể làm việc. Cảm ơn! – Philip

+0

Điều này có vẻ là giải pháp làm việc duy nhất. Câu trả lời được đánh giá cao. –

+0

đây cũng là câu trả lời hay nhất cho tôi, cảm ơn –

1

Trong Django 1,9 tôi phải làm bước Kat Russo, nhưng sự di cư thứ hai là một chút khéo léo. Bạn phải chạy

./manage.py migrate --run-syncdb 
+0

điều này hữu ích – NFern

Các vấn đề liên quan