Đây chỉ là một lý thuyết mà tôi muốn tìm ra dựa trên phản hồi của những người khác và có lẽ những trải nghiệm tương tự.Django kiểm tra SQLite oddity: con đường khác nhau của thực hiện?
Đã sử dụng mySQL để chạy thử nghiệm, nhưng tất nhiên cơ sở dữ liệu SQLite trong bộ nhớ nhanh hơn nhiều. Tuy nhiên, có vẻ như đã gặp phải một số vấn đề.
Khi DATABASE_ENGINE
được thiết lập để sử dụng django.db.backends.sqlite3
và tôi chạy manage.py test
, đầu ra không được như kỳ vọng:
(hầu hết các dòng Removed, nhưng chỉ ra điểm thú vị của thất bại)
$ python manage.py test Traceback (most recent call last): File "manage.py", line 12, in execute_manager(settings) File "/Users/bartekc/.virtualenvs/xx/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager utility.execute() File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 51, in class AcvTripIncentive(models.Model): # First interesting failure File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 55, in AcvTripIncentive trip = models.OneToOneField(Trip, limit_choices_to={'sites' : Site.objects.get(name='ZZ'), 'is_active' : True,}) # Next interesting failure File "/Users/bartekc/domains/xx/xx/associates/yyz/models.py", line 252, in current_site = Site.objects.get_current()
Có nhiều thất bại như thế này nhưng chỉ ra một cặp vợ chồng. Vấn đề là hiển nhiên. Mô hình trang web không có dữ liệu thực tế, nhưng các tệp chứa mã cố gắng tìm nạp các cá thể hiện tại hoặc cụ thể trong mô hình Site.
Bây giờ, tôi có thể nghĩ ra một giải pháp dễ dàng: Điều đó OneToOneField
nên được chuyển sang sử dụng một hàm với limit_choices_to
và thứ hai giống nhau. Các chức năng này sau đó được gọi khi được yêu cầu, không phải trên quét ban đầu của tập tin bởi Django.
Tuy nhiên, câu hỏi thực tế của tôi là: Tại sao điều này xảy ra với SQLite chứ không phải mySQL?. Có cách nào khác nhau để hai bộ máy cơ sở dữ liệu xử lý thông qua các thử nghiệm không? Tôi sẽ không nghĩ như vậy, kể từ khi Python đang làm tất cả các biên dịch của các mô hình.
Chính xác điều gì đang xảy ra ở đây?
Chúc mừng.
Bạn có nghĩ rằng cơ sở dữ liệu sqlite được tạo mới và trống mỗi khi bạn chạy thử nghiệm, trong khi cơ sở dữ liệu mysql có thể giống với bạn sử dụng cho sản xuất/phát triển và đã có thêm một số dữ liệu trong đó? –
Cơ sở dữ liệu mySQL cũng được tạo mới mỗi lần. – Bartek
Nơi nào bạn gọi Site.objects.get_current() trong mô hình của bạn? Là nó trong phương thức save() hoặc trong một tín hiệu? –