2012-12-07 35 views
7

Tôi có mô hình django, TestModel, qua cơ sở dữ liệu SQL.Mô hình Django truy xuất cùng một kết quả

Bất cứ khi nào tôi làm

TestModel.objects.all() 

tôi dường như nhận được kết quả tương tự nếu tôi chạy nó nhiều lần từ quá trình tương tự. Tôi đã thử nghiệm bằng cách xóa thủ công (không sử dụng BẤT CỨ nguyên thủy django) một dòng từ bảng mô hình được xây dựng trên, truy vấn vẫn trả về kết quả tương tự, mặc dù rõ ràng sẽ có ít đối tượng hơn sau khi xóa.

Có cơ chế lưu bộ nhớ đệm nào sắp xếp và django không chuyển đến cơ sở dữ liệu mỗi lần tôi muốn truy xuất các đối tượng không?

Nếu có, có cách nào tôi vẫn có thể buộc django đi đến cơ sở dữ liệu trên mỗi truy vấn, tốt nhất là không viết các truy vấn SQL thô?

Tôi cũng nên xác định rằng bằng cách khởi động lại quy trình, mô hình lại trả về đúng đối tượng, tôi không thấy các đối tượng đã xóa nữa, nhưng nếu tôi xóa thêm một số vấn đề xảy ra lần nữa.

+0

Tôi không biết Django chút nào, nhưng lần trước tôi gặp vấn đề tương tự, tôi nhận ra mình không sử dụng cơ sở dữ liệu mà tôi nghĩ là mình. Bạn đã không thay đổi đường dẫn gần đây hoặc bất cứ điều gì, có bạn? – PeterBB

+0

@PeterBB Tôi đã cập nhật mô tả, tôi chắc chắn rằng tôi đang sử dụng đúng cơ sở dữ liệu vì các thay đổi được cập nhật với mọi lần khởi động lại quá trình đang sử dụng mô hình. –

+0

Điều này xảy ra giữa các yêu cầu web hoặc ở cấp độ trình bao? – danihp

Trả lời

1

Điều này là do mức độ cách ly cơ sở dữ liệu của bạn có thể đọc được lặp lại. Trong một vỏ django tất cả các yêu cầu được đính kèm trong một giao dịch duy nhất.

Sửa

Bạn có thể thử trong shell của bạn:

from django.db import transaction 
with transaction.autocommit(): 
    t = TestModel.objects.all() 
    ... 
-1

Âm thanh như một vấn đề giao dịch db. Nếu bạn đang giữ phiên trình bao mở khi bạn đi riêng vào cơ sở dữ liệu và sửa đổi dữ liệu, giao dịch đang mở trong trình bao sẽ không thấy thay đổi do bị cô lập. Bạn sẽ cần phải thoát ra và tải lại shell để có được một giao dịch mới trước khi bạn có thể nhìn thấy chúng.

Lưu ý rằng trong sản xuất, giao dịch được liên kết với chu kỳ yêu cầu/phản hồi, do đó, đây không phải là vấn đề đáng kể.

+0

Đây là một vấn đề rất quan trọng cần lưu ý trong sản xuất. Bởi vì mức độ cô lập cao gây ra nhiều khóa hơn và mức cô lập thấp có thể có tác động tính toán. – danihp

+0

Tôi không có nghĩa là bản thân các giao dịch không đáng kể, chỉ là bạn sẽ không thấy loại mâu thuẫn này thường, bởi vì các yêu cầu ngắn ngủi. –

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