Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Browse files

The database cache wasn't correctly handling expired keys. Fixed now.

The cache tests have been failing for a long time with the db backend. This
change makes them pass again, so no test changes required here.

git-svn-id: bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent e2cb272 commit 8f28a84a9816812fc98b3f593c6f3f2537475dd9 @malcolmt malcolmt committed
Showing with 6 additions and 3 deletions.
  1. +6 −3 django/core/cache/backends/
9 django/core/cache/backends/
@@ -54,9 +54,11 @@ def _base_set(self, mode, key, value, timeout=None):
if num > self._max_entries:
self._cull(cursor, now)
encoded = base64.encodestring(pickle.dumps(value, 2)).strip()
- cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s" % self._table, [key])
+ cursor.execute("SELECT cache_key, expires FROM %s WHERE cache_key = %%s" % self._table, [key])
- if mode == 'set' and cursor.fetchone():
+ result = cursor.fetchone()
+ if result and (mode == 'set' or
+ (mode == 'add' and result[1] < now)):
cursor.execute("UPDATE %s SET value = %%s, expires = %%s WHERE cache_key = %%s" % self._table, [encoded, str(exp), key])
cursor.execute("INSERT INTO %s (cache_key, value, expires) VALUES (%%s, %%s, %%s)" % self._table, [key, encoded, str(exp)])
@@ -73,8 +75,9 @@ def delete(self, key):
def has_key(self, key):
+ now =
cursor = connection.cursor()
- cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s" % self._table, [key])
+ cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s and expires > %%s" % self._table, [key, now])
return cursor.fetchone() is not None
def _cull(self, cursor, now):

0 comments on commit 8f28a84

Please sign in to comment.
Something went wrong with that request. Please try again.