PostgreSQL ist „stark typisiert“ – das heißt, jeder Wert in jeder Abfrage hat einen bestimmten Typ, entweder explizit definiert (z. B. der Typ einer Spalte in einer Tabelle) oder implizit (z. B. die Werte, die in ein WHERE
Klausel). Alle Funktionen und Operatoren, einschließlich =
, müssen so definiert werden, dass sie bestimmte Typen akzeptieren - so gibt es beispielsweise einen Operator für VarChar = VarChar
, und ein anderes für int = int
.
In Ihrem Fall haben Sie eine Spalte, die explizit als Typ int
definiert ist , aber Sie vergleichen ihn mit einem Wert, den PostgreSQL als Typ text
interpretiert hat .
SQLite hingegen ist "schwach typisiert" - Werte werden frei so behandelt, als seien sie vom Typ, der am besten zu der auszuführenden Aktion passt. Also in Ihrer dev SQLite-Datenbank die Operation '42' = 42
kann gut berechnet werden, wo PostgreSQL eine spezifische Definition von VarChar = int
benötigen würde (oder text = int
, text
der Typ für unbegrenzte Strings in PostgreSQL).
Nun wird PostgreSQL manchmal Seien Sie hilfreich und "casten" Sie Ihre Werte automatisch, damit die Typen mit einem bekannten Operator übereinstimmen, aber häufiger müssen Sie dies explizit tun, wie der Hinweis sagt. Wenn Sie die SQL selbst schreiben, könnte eine explizite Schreibweise so aussehen:WHERE id = CAST('42' AS INT)
(oder WHERE CAST(id AS text) = '42'
).
Da dies nicht der Fall ist, müssen Sie sicherstellen, dass die Eingabe, die Sie dem Abfragegenerator geben, eine tatsächliche Ganzzahl ist und nicht nur eine Zeichenfolge, die zufällig aus Ziffern besteht. Ich vermute, das ist so einfach wie die Verwendung von fields.IntegerField
statt fields.CharField
, aber ich kenne Django oder sogar Python nicht wirklich, also dachte ich, ich gebe Ihnen den Hintergrund in der Hoffnung, dass Sie es von dort aus nehmen können.