Eu recebi muitos erros com a mensagem:
"DatabaseError: current transaction is aborted, commands ignored until end of transaction block"
depois mudou de python-psycopg para python-psycopg2 como o mecanismo de banco de dados do projeto Django.
O código permanece o mesmo, apenas não sei de onde são esses erros.
python
django
postgresql
psycopg2
jack
fonte
fonte
conn.rollback()
(onde conn é o seu objeto de conexão) irá limpar o erro para que você possa executar outras consultasRespostas:
É isso que o postgres faz quando uma consulta produz um erro e você tenta executar outra consulta sem reverter a transação. (Você pode considerá-lo um recurso de segurança para impedir a corrupção de seus dados.)
Para corrigir isso, você deve descobrir em que parte do código essa consulta incorreta está sendo executada. Pode ser útil usar as opções log_statement e log_min_error_statement no seu servidor postgresql.
fonte
Para se livrar do erro, reverta a última transação (incorreta) depois de corrigir seu código:
Você pode usar try-except para impedir que o erro ocorra:
Consulte: Documentação do Django
fonte
IntegrityError
e não a classe baseDatabaseError
?Então, eu tive esse mesmo problema. O problema que eu estava tendo aqui era que meu banco de dados não estava sincronizado corretamente. Problemas simples sempre parecem causar a maior angústia ...
Para sincronizar seu django db, no diretório do seu aplicativo, no terminal, digite:
Edit: Observe que se você estiver usando o django-south, a execução do comando '$ python manage.py migrate' também poderá resolver esse problema.
Feliz codificação!
fonte
python manage.py migrate <app>
... para todos os meus aplicativos.django-south
- omigrate
comando não está embutido no django.No Flask, você só precisa escrever:
A documentação do PS está aqui https://www.postgresql.org/docs/9.4/static/sql-rollback.html
fonte
Na minha experiência, esses erros acontecem desta maneira:
Não há nada errado com a segunda consulta, mas desde que o erro real foi detectado, a segunda consulta é a que gera o erro (muito menos informativo).
edit: isso só acontece se a
except
cláusulaIntegrityError
capturar (ou qualquer outra exceção de banco de dados de baixo nível), se você capturar algo comoDoesNotExist
esse erro, não será exibido, porqueDoesNotExist
não corrompe a transação.A lição aqui é não tente / exceto / passe.
fonte
Eu acho que o padrão que o sacerdote menciona é mais provável que seja a causa usual desse problema ao usar o PostgreSQL.
No entanto, sinto que há usos válidos para o padrão e não acho que esse problema deva ser um motivo para sempre evitá-lo. Por exemplo:
Se você se sente bem com esse padrão, mas deseja evitar um código explícito de manipulação de transações em todo o lugar, convém ativar o modo de confirmação automática (PostgreSQL 8.2+): https://docs.djangoproject.com/en/ dev / ref / database / # modo de confirmação automática
Não tenho certeza se existem considerações importantes sobre desempenho (ou de qualquer outro tipo).
fonte
Se você obtiver isso no shell interativo e precisar de uma solução rápida, faça o seguinte:
originalmente visto nesta resposta
fonte
Encontrei um comportamento semelhante ao executar uma transação com defeito no
postgres
terminal. Nada passou depois disso, pois odatabase
estado está emerror
. No entanto, apenas como uma solução rápida, se você puder evitarrollback transaction
. A seguir, fiz o truque para mim:COMMIT;
fonte
Eu tenho o problema de silimar. A solução foi migrar o banco de dados (
manage.py syncdb
oumanage.py schemamigration --auto <table name>
se você usar o sul).fonte
basta usar reversão
Código de exemplo
fonte
Eu também tive esse erro, mas ele estava mascarando outra mensagem de erro mais relevante em que o código estava tentando armazenar uma sequência de 125 caracteres em uma coluna de 100 caracteres:
Eu tive que depurar o código para a mensagem acima aparecer, caso contrário ela exibe
fonte
Em resposta a @priestc e @Sebastian, e se você fizer algo assim?
Eu apenas tentei esse código e ele parece funcionar, falhando silenciosamente sem precisar se preocupar com possíveis erros e funcionando quando a consulta é boa.
fonte
Creio que a resposta de @ AnujGupta está correta. No entanto, a reversão pode gerar uma exceção que você deve capturar e manipular:
Se você estiver reescrevendo esse código em vários
save()
locais, poderá extrair o método:Por fim, você pode pré-modificá-lo usando um decorador que protege métodos que usam
save()
:Mesmo se você implementar o decorador acima, ainda é conveniente mantê-lo
try_rolling_back()
como um método extraído, caso você precise usá-lo manualmente nos casos em que é necessário um manuseio específico, e o manuseio do decorador genérico não é suficiente.fonte
Este é um comportamento muito estranho para mim. Estou surpreso que ninguém pensou em pontos de salvaguarda. No meu código, a consulta com falha era o comportamento esperado:
Alterei o código dessa maneira para usar os pontos de salvamento:
fonte
No shell Flask, tudo que eu precisava fazer era
session.rollback()
superar isso.fonte
Eu encontrei esse problema, o erro aparece porque as transações de erro não foram encerradas corretamente, encontrei o
postgresql_transactions
comando Transaction Control aquiControle de Transação
Os seguintes comandos são usados para controlar transações
então eu uso o
END TRANSACTION
para terminar o erro TRANSACTION, código como este:fonte
você pode desativar a transação via "set_isolation_level (0)"
fonte