PostgreSQL jest "silnie typizowany" - co oznacza, że każda wartość w każdym zapytaniu ma określony typ, zdefiniowany jawnie (np. typ kolumny w tabeli) lub niejawnie (np. wartości wprowadzane do WHERE
klauzula). Wszystkie funkcje i operatory, w tym =
, muszą być zdefiniowane jako akceptujące określone typy - tak na przykład istnieje operator dla VarChar = VarChar
i inny dla int = int
.
W twoim przypadku masz kolumnę, która jest wyraźnie zdefiniowana jako typ int
, ale porównujesz go z wartością, którą PostgreSQL zinterpretował jako typ text
.
Z drugiej strony SQLite jest "słabo wpisany" - wartości są swobodnie traktowane jako dowolnego typu, który najlepiej pasuje do wykonywanej akcji. Tak więc w twojej dev SQLite bazie danych operacja '42' = 42
można obliczyć dobrze, gdzie PostgreSQL wymagałby określonej definicji VarChar = int
(lub text = int
, text
jest typem dla nieograniczonych ciągów w PostgreSQL).
Teraz PostgreSQL czasami bądź pomocny i automatycznie „rzucaj” swoje wartości, aby typy pasowały do znanego operatora, ale częściej, jak mówi podpowiedź, musisz to zrobić wprost. Jeśli sam piszesz SQL, jawny typ wielkości liter może wyglądać tak:WHERE id = CAST('42' AS INT)
(lub WHERE CAST(id AS text) = '42'
).
Ponieważ tak nie jest, musisz upewnić się, że dane wejściowe, które podajesz do generatora zapytań, jest rzeczywistą liczbą całkowitą, a nie tylko łańcuchem, który składa się z cyfr. Podejrzewam, że jest to tak proste, jak użycie fields.IntegerField
zamiast fields.CharField
, ale tak naprawdę nie znam Django ani nawet Pythona, więc pomyślałem, że przedstawię ci tło w nadziei, że możesz to stamtąd wyciągnąć.