PostgreSQL được "gõ mạnh" - nghĩa là mọi giá trị trong mọi truy vấn đều có một kiểu cụ thể, được xác định rõ ràng (ví dụ:kiểu cột trong bảng) hoặc ngầm định (ví dụ:các giá trị được nhập vào mã WHERE > mệnh đề). Tất cả các hàm và toán tử, bao gồm
=
, phải được định nghĩa là chấp nhận các kiểu cụ thể - ví dụ:có một toán tử cho VarChar =VarChar
và một mã khác cho int =int
.
Trong trường hợp của bạn, bạn có một cột được xác định rõ ràng là loại int
, nhưng bạn đang so sánh nó với một giá trị mà PostgreSQL đã hiểu là kiểu text
.
Mặt khác, SQLite được "gõ yếu" - các giá trị được tự do coi là thuộc bất kỳ kiểu nào phù hợp nhất với hành động đang được thực hiện. Vì vậy, trong cơ sở dữ liệu SQLite dành cho nhà phát triển của bạn, thao tác '42' =42
có thể được tính toán tốt, trong đó PostgreSQL sẽ cần một định nghĩa cụ thể về VarChar =int
(hoặc text =int
, text
là loại cho các chuỗi không bị ràng buộc trong PostgreSQL).
Bây giờ, PostgreSQL sẽ đôi khi hữu ích và tự động "truyền" các giá trị của bạn để làm cho các loại khớp với một toán tử đã biết, nhưng thường xuyên hơn, như gợi ý cho biết, bạn cần thực hiện điều đó một cách rõ ràng. Nếu bạn đang tự viết SQL, một trường hợp loại rõ ràng có thể trông giống như WHERE id =CAST ('42 'AS INT)
(hoặc WHERE CAST (id AS text) ='42'
).
Vì không phải vậy, bạn cần đảm bảo rằng đầu vào mà bạn cung cấp cho trình tạo truy vấn là một số nguyên thực tế, không chỉ là một chuỗi bao gồm các chữ số. Tôi nghi ngờ việc này đơn giản như việc sử dụng fields.IntegerField
chứ không phải là fields.CharField
, nhưng tôi thực sự không biết Django, hoặc thậm chí cả Python, vì vậy tôi nghĩ tôi sẽ cung cấp cho bạn kiến thức nền với hy vọng bạn có thể nắm bắt nó từ đó.