2009-12-30 4 views
8

Tôi có một dự án Django khá phức tạp mà làm cho nó khó khăn/không thể sử dụng đồ đạc để tải dữ liệu.Tải SQL dump trước khi chạy thử nghiệm Django

Những gì tôi muốn làm là để tải một bãi chứa cơ sở dữ liệu từ máy chủ cơ sở dữ liệu sản xuất sau khi tất cả các bảng đã Bene tạo ra bởi các testrunner và trước khi kiểm tra thực tế bắt đầu chạy.

Tôi đã thử nhiều "ma thuật" trong MyTestCase.setUp(), nhưng không có may mắn.

Mọi góp ý sẽ được hoan nghênh nhất. Cảm ơn.

+2

Nếu tôi không nhầm tải sql sẽ nhanh hơn bởi vì nó không có các chi phí mà đồ đạc làm. Tôi đang tìm cách giải quyết vấn đề tương tự này. Tôi có một DB lớn để tải để thử nghiệm và tôi muốn giữ tải nhanh chóng. – Jeff

+0

Tôi sử dụng các mối quan hệ chung rộng rãi, đó là một vấn đề khi sử dụng đồ đạc. Có vẻ như điều này vừa được giải quyết trong công việc hướng tới 1.2, xem http://docs.djangoproject.com/en/dev/topics/serialization/#natural-keys – knutin

+4

Thật đáng tiếc khi bạn chỉ có thể bình chọn bình luận lên, chứ không phải xuống. Lời bình luận đầu tiên đó chỉ là những lời reek. – boatcoder

Trả lời

0

Bạn có thể cần phải nhìn vào việc xác định một Á hậu kiểm tra tùy chỉnh. Có một số thông tin ở đây: http://docs.djangoproject.com/en/dev/topics/testing/#using-different-testing-frameworks

Về cơ bản tôi nghĩ bạn chỉ có thể sao chép nhân tố thử nghiệm mặc định từ django.test.simple.run_tests và sau đó sửa đổi nó cho phù hợp với nhu cầu của bạn.

Tôi đã không làm điều này trước đây, nhưng từ sự hiểu biết của tôi sẽ là cách để tùy chỉnh điều này.

-1

Đèn chiếu sáng là lựa chọn tốt nhất. Bạn đã thử sử dụng ./manage.py dumpdata để tạo lịch thi đấu từ cơ sở dữ liệu hiện tại của bạn chưa? Tôi đã không thấy rằng thất bại trên các mô hình phức tạp, nhưng tôi đoán nó có thể.

Giả sử bạn đang sử dụng mysql, bạn sẽ có thể để kịch bản này bằng cách sử dụng mysqldump.

7

Django hỗ trợ các file SQL tải khi làm syncdb, đặt lại hoặc bắt đầu một Á hậu kiểm tra - điều này thực hiện chính xác những gì bạn mô tả:

http://docs.djangoproject.com/en/dev/howto/initial-data/#providing-initial-sql-data

Bạn cần phải tạo một "sql" thư mục trong ứng dụng của bạn thư mục, và sau đó đặt một tập tin có tên "mymodel.sql" trong thư mục đó (nơi "MyModel" là tên mô hình tương ứng).

myproject/ 
    |--myapp/ 
     |--sql/ 
      |--mymodel.sql 

Bạn có thể tạo SQL này bằng công cụ kết xuất cho cơ sở dữ liệu của mình.

  • SQLite [1]: echo '.dump' | sqlite3 yourdbname.sqlite> myapp/sql/mymodel.sql
  • MySQL [2]: mysqldump yourdbname> myapp/sql/mymodel.sql
  • PostgreSQL [3]: pg_dump yourdbname> myapp/sql/mymodel.sql

Sau khi bán phá giá, bạn sẽ cần chỉnh sửa tệp để xóa mọi thứ trừ các câu lệnh INSERT thích hợp hoặc các nội dung phức tạp khác. Cụ thể, bạn phải loại bỏ xử lý giao dịch, tạo chỉ mục và tạo bảng SQL để tránh lỗi khi tải các câu lệnh tạo trùng lặp.

Tôi sử dụng phương pháp này để tải đồ đạc thực sự, thực sự lớn - phải mất quá lâu để xử lý các json, nhưng một nhập khẩu sql thẳng là khá linh hoạt. Lưu ý rằng phương pháp này sẽ tải sql cho bất kỳ lời gọi synchdb, reset, vv ngoài việc tải dữ liệu cho runner thử nghiệm - vì vậy bạn sẽ không thể có dữ liệu khác nhau cho các trường hợp thử nghiệm khác nhau và bạn phải xóa các tệp trước khi đặt lại nếu bạn không muốn chúng tải lại máy chủ sản xuất của mình.

[1] http://www.sqlite.org/sqlite.html

[2] http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

[3] http://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP

+11

Vì câu trả lời này đã được đăng, hành vi này đã trở nên không khả dụng ở Django. Django 1.2 bây giờ bỏ qua các tệp 'sql' trong thư mục' sql/'khi chạy khung kiểm tra. –