Django+Postgres: "current transaction is aborted, commands ignored until end of transaction block"

Solution 1:

You can try this:

from django.db import connection
connection._rollback()

The more detailed discussion of This issue can be found here

Solution 2:

this happens to me sometimes, often it's the missing

manage.py migrate 

or

manage.py syncdb

as mentioned also here

it also can happen the other way around, if you have a schemamigration pending from your models.py. With south you need to update the schema with.

manage.py schemamigration mymodel --auto

Solution 3:

Check this

The quick answer is usually to turn on database level autocommit by adding:

'OPTIONS': {'autocommit': True,}

To the database settings.

Solution 4:

I had this error after restoring a backup to a totally empty DB. It went away after running:

./manage syncdb 

Maybe there were some internal models missing from the dump...

Solution 5:

WARNING: the patch below can possibly cause transactions being left in an open state on the db (at least with postgres). Not 100% sure about that (and how to fix), but I highly suggest not doing the patch below on production databases.

As the accepted answer does not solve my problems - as soon as I get any DB error, I cannot do any new DB actions, even with a manual rollback - I came up with my own solution.

When I'm running the Django-shell, I patch Django to close the DB connection as soon as any errors occur. That way I don't ever have to think about rolling back transactions or handling the connection.

This is the code I'm loading at the beginning of my Django-shell-session:

from django import db
from django.db.backends.util import CursorDebugWrapper
old_execute = CursorDebugWrapper.execute
old_execute_many = CursorDebugWrapper.executemany

def execute_wrapper(*args, **kwargs):
    try:
        old_execute(*args, **kwargs)
    except Exception, ex:
        logger.error("Database error:\n%s" % ex)
        db.close_connection()

def execute_many_wrapper(*args, **kwargs):
    try:
        old_execute_many(*args, **kwargs)
    except Exception, ex:
        logger.error("Database error:\n%s" % ex)
        db.close_connection()

CursorDebugWrapper.execute = execute_wrapper
CursorDebugWrapper.executemany = execute_many_wrapper