How to clear the whole cache when using django’s page_cache decorator?

I’ve had this problem with an SQLite database cache – the clear() method doesn’t clear the cache although it works fine with a MySQL database cache. It seems that a SQLite cache needs a call to django.db.transation.commit_unless_managed() after the DELETE from [table] statement is run.

I have been using multiple caches since before official support was added into core as part of 1.3 and so have a wrapper round several of the cache calls – including clear() – so I was able to override this method and include the commit_unless_managed(). I think I should probably log it as a bug.

Here’s the outline of the code I’m using to flush a memcache cache (the default cache in django.core.cache) and a database cache stored in the cache_table of the settings.DATABASES['cache_database'] database.

from django.db import connections, transaction
from django.core.cache import cache # This is the memcache cache.

def flush():
    # This works as advertised on the memcached cache:
    cache.clear()
    # This manually purges the SQLite cache:
    cursor = connections['cache_database'].cursor()
    cursor.execute('DELETE FROM cache_table')
    transaction.commit_unless_managed(using='cache_database')

Rather than being lazy and hard coding it the way I have it should be pretty easy to get the values from settings.CACHES and django.db.router.

Leave a Comment

tech