PostgreSQL je „silně typovaný“ – to znamená, že každá hodnota v každém dotazu má konkrétní typ, buď definovaný explicitně (např. typ sloupce v tabulce), nebo implicitně (např. hodnoty zadané do WHERE
doložka). Všechny funkce a operátory, včetně =
, musí být definovány jako akceptující specifické typy - takže například existuje operátor pro VarChar = VarChar
a jiný pro int = int
.
Ve vašem případě máte sloupec, který je explicitně definován jako typ int
, ale porovnáváte ji s hodnotou, kterou PostgreSQL interpretoval jako typ text
.
SQLite je na druhé straně "slabě typovaný" - s hodnotami se volně zachází jako s jakýmkoli typem, který nejlépe vyhovuje prováděné akci. Takže ve vaší dev SQLite databázi operace '42' = 42
lze v pohodě vypočítat, kde by PostgreSQL potřeboval konkrétní definici VarChar = int
(nebo text = int
, text
je typem pro neomezené řetězce v PostgreSQL).
Nyní bude PostgreSQL někdy buďte nápomocní a automaticky „přetypujte“ své hodnoty, aby typy odpovídaly známému operátoru, ale častěji, jak říká nápověda, to musíte dělat explicitně. Pokud byste psali SQL sami, explicitní případ typu by mohl vypadat takto:WHERE id = CAST('42' AS INT)
(nebo WHERE CAST(id AS text) = '42'
).
Protože nejste, musíte zajistit, aby vstup, který zadáte generátoru dotazů, byl skutečným celým číslem, nikoli pouze řetězcem, který se náhodou skládá z číslic. Mám podezření, že je to stejně jednoduché jako použití fields.IntegerField
spíše než fields.CharField
, ale ve skutečnosti neznám Djanga, dokonce ani Python, takže jsem si řekl, že vám poskytnu pozadí v naději, že to odtamtud převezmete.