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
.