PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

heroku, postgreSQL, django, comentários, tastypie:Nenhum operador corresponde ao nome e tipo de argumento fornecidos. Pode ser necessário adicionar conversões de tipo explícitas


O PostgreSQL é "fortemente tipado" - ou seja, cada valor em cada consulta tem um tipo específico, definido explicitamente (por exemplo, o tipo de uma coluna em uma tabela) ou implicitamente (por exemplo, os valores inseridos em um WHERE> cláusula). Todas as funções e operadores, incluindo = , devem ser definidos como aceitando tipos específicos - então, por exemplo, existe um operador para VarChar = VarChar , e um diferente para int = int .

No seu caso, você tem uma coluna que é explicitamente definida como tipo int , mas você está comparando com um valor que o PostgreSQL interpretou como tipo text .

O SQLite, por outro lado, é "fracamente tipado" - os valores são tratados livremente como sendo de qualquer tipo que melhor se adapte à ação que está sendo executada. Portanto, em seu banco de dados dev SQLite, a operação '42' = 42 pode ser calculado muito bem, onde o PostgreSQL precisaria de uma definição específica de VarChar = int (ou text = int , text sendo o tipo para strings ilimitadas no PostgreSQL).

Agora, o PostgreSQL irá às vezes seja útil e "transforme" automaticamente seus valores para fazer com que os tipos correspondam a um operador conhecido, mas com mais frequência, como diz a dica, você precisa fazer isso explicitamente. Se você estivesse escrevendo o SQL por conta própria, um caso de tipo explícito poderia se parecer com WHERE id = CAST('42' AS INT) (ou WHERE CAST(id AS text) = '42' ).

Como você não está, você precisa garantir que a entrada fornecida ao gerador de consulta seja um inteiro real, não apenas uma string que consiste em dígitos. Eu suspeito que isso seja tão simples quanto usar fields.IntegerField em vez de fields.CharField , mas eu realmente não conheço Django, ou mesmo Python, então eu pensei em dar a você o background na esperança de que você possa continuar a partir daí.