Django: Query funciona bem com o SQLITE3, não com outros sistemas de gerenciamento de banco de dados
-
19-09-2019 - |
Pergunta
Eu tenho uma consulta bastante longa com 'q ()', com Sqlite3
funciona muito bem, mas com postgresql
ou mysql
Eu tenho um erro estranho, por exemplo, para o PostgreSQL: invalid input syntax for integer: "("
E para MySQL: Truncated incorrect DOUBLE value: '('
Como eu poderia executar essa consulta com o MySQL? Onde está meu erro?
Aqui está essa consulta:
watchersTuple = self.getWatchers()
tagsTuple = self.getTags()
blockedUserTuple = self.getBlockedUser()
blockedTagTuple = self.getBlockedTag()
statuses = Status.objects.filter( (Q(author__in = str(watchersTuple)) | Q(tags__in = str(tagsTuple)) | Q(author = self) | Q(recipient = self)) & ~Q(author__in = str(blockedUserTuple)) & ~Q(tags__in = str(blockedTagTuple)) ).distinct()
Solução
Você não postou seus modelos, mas parece author
é um campo inteiro, ou talvez uma chave estrangeira. Nesse caso, por que você está usando str
na tupla dos valores? Você presumivelmente deseja verificar se o autor é um desses valores. Então, basta remover o str
ligar.
A razão pela qual parece funcionar no sqlite é que o sqlite ignora tipos de campo - strings e números inteiros são tratados da mesma forma. Outros DBMSs são mais rigorosos.
Outras dicas
Não há nada óbvio olhando para a consulta. Seria útil comparar as consultas brutas para o SQLITE3 e MYSQL. este link Mostra como ativar a depuração da consulta SQL.