2010-02-18 38 views
15

Làm thế nào để tôi hoàn toàn đặt lại Django (1,2 alpha) DB (xóa tất cả các bảng, thay vì chỉ xóa chúng)?Hoàn thành thiết lập django DB

manage.py flush không quá ít (sẽ không hoạt động nếu có thay đổi lược đồ) và manage.py reset yêu cầu tôi chỉ định tất cả ứng dụng (và có định dạng khác "" .join (INSTALLED_APPS)). Tôi rõ ràng có thể đạt được điều này trong một cách cụ thể DB, nhưng tôi figured phải có một sane, DB phụ trợ agnostic cách để làm điều này.

[Chỉnh sửa: Tôi đang tìm một thứ mà tôi có thể gọi từ tập lệnh, ví dụ: một Makefile và tiếp tục làm việc nếu tôi thay đổi DB backend hoặc thêm vào settings.INSTALLED_APPS]

Trả lời

16

This Snippet cung cấp cho bạn mã cho một lệnh manage.py reset_db bạn có thể cài đặt, đó là sự thay đổi tối thiểu mà giải quyết vấn đề của bạn


Điều đó nói rằng, từ ý kiến ​​dưới đây:

bạn cũng có thể chỉ cài đặt tiện ích mở rộng lệnh Django để nhận reset_db và các tính năng khác: https://github.com/django-extensions/django-extensions

+7

Bạn cũng có thể chỉ cần cài đặt các phần mở rộng lệnh Django để có được reset_db và các tính năng khác: http://code.google.com/p/django-command-extensions/ –

+0

Điều đó có vẻ đầy hứa hẹn! – jathanism

+0

Tuyệt vời - trông chính xác những gì tôi cần! –

1

Bạn muốn sqlreset:

% python manage.py help sqlreset 
Usage: manage.py sqlreset [options] <appname appname ...> 

Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app name(s). 

Options: 
    -v VERBOSITY, --verbosity=VERBOSITY 
         Verbosity level; 0=minimal output, 1=normal output, 
         2=all output 
    --settings=SETTINGS The Python path to a settings module, e.g. 
         "myproject.settings.main". If this isn't provided, the 
         DJANGO_SETTINGS_MODULE environment variable will be 
         used. 
    --pythonpath=PYTHONPATH 
         A directory to add to the Python path, e.g. 
         "/home/djangoprojects/myproject". 
    --traceback   Print traceback on exception 
    --version    show program's version number and exit 
    -h, --help   show this help message and exit 

Giống như khi bạn thay đổi một mô hình, Django sẽ không tự động làm việc này cho bạn. Nó sẽ chỉ xuất các lệnh cho bạn sao chép và dán.

+0

'manage.py reset' mà tôi đã đề cập ở trên chỉ là một trình bao bọc xung quanh' sqlreset' để chính xác cùng một vấn đề được áp dụng: Tôi không muốn liệt kê tất cả tên ứng dụng theo cách thủ công. Tôi muốn một giải pháp có thể được tự động hóa và tiếp tục hoạt động nếu tôi thêm vào 'INSTALLED_APPS' trong' settings.py'. –

+0

Bạn sẽ phải cuộn tập lệnh của riêng mình sau đó. Tôi không nghĩ rằng chức năng này tồn tại như hiện tại. – jathanism

0

Chỉ định một cơ sở dữ liệu mới và thả db này từ bảng điều khiển db. Dường như với tôi là đơn giản nhất.

+0

Xin lỗi, tôi nên nói rõ rằng tôi cần một thứ có thể được tự động hóa. –

+0

@as: Cơ sở dữ liệu thả không tự động như thế nào? Cơ sở dữ liệu của bạn là gì? Viết một kịch bản lệnh SQL vào 'DROP DATABASE x;' và chạy nó. –

-1

hãy xem lệnh đặt lại trong mã của django và viết mã của riêng bạn để giảm/tạo DB trước.

0

Hm, có thể bạn nói dối với manage.py, giả vờ để làm cho đồ đạc, nhưng chỉ để tìm kiếm ứng dụng:

ứng dụng = $ (python manage.py makefixture 2> & 1 | egrep -v ' (^ Lỗi |^django) '| awk -F.' {Print $ 2} '| uniq); cho tôi trong $ ứng dụng; làm python manage.py sqlreset $ i; đã hoàn thành | grep DROP

Điều đó in ra một danh sách các câu lệnh DROP TABLE cho tất cả các bảng ứng dụng của dự án của bạn, không bao gồm bảng django. Nếu bạn muốn bao gồm chúng, hãy xóa mẫu |^django ướp nôn.

Nhưng làm thế nào để nạp phần cơ sở dữ liệu chính xác? sed/awk-ing thông qua settings.conf? Hoặc tốt hơn bằng cách sử dụng một kịch bản lệnh python.

0

Giả sử bạn là (may mắn) trong một môi trường Linux cũng như:

  • sử dụng MySQL và biết người dùng/mật khẩu để truy cập vào db của dự án
  • bash, mysql, readlink được cài đặt
  • settings.py là cài đặt.py
  • dbname là giống như tên dự án django của bạn (xem MyApp var bên dưới)
  • tất cả các ứng dụng bạn muốn thiết lập lại được liệt kê trong INSTALLED_APPS như dây đàn với tên mô-đun đầy đủ (bắt đầu với tên của django của bạn dự án)

Thay đổi thư mục hiện tại của bạn thành mã dự án nơi manag.py và settings.py cư trú. Sau đó, hãy chạy như sau:

MYAPP=$(basename $(dirname `readlink -m settings.py`));DJANGOAPPS=$(echo 'import settings; print " ".join([ str(app).lstrip("'${MYAPP}'.") for app in settings.INSTALLED_APPS if "'${MYAPP}'" in app ])' | python -); python manage.py sqlreset $DJANGOAPPS | mysql -u root --password ${MYAPP} 

Nếu bạn hiểu điều gì sẽ xảy ra với ý tưởng này (ví dụ: đặt nó vào Makefile).

+0

Lưu ý rằng echo 'DROP DATABASE dbx;' | mysql dbx theo đề xuất của S.Lott cũng hoạt động trong thế giới của dòng lệnh unix. Sau đó, bạn chỉ cần gọi syncdb –

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