PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

heroku, postgreSQL, django, comments, deliciouspie:Kein Operator stimmt mit dem angegebenen Namen und Argumenttyp(en) überein. Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen

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.