diff options
author | Jordan Cook <jordan.cook@pioneer.com> | 2022-04-10 15:39:08 -0500 |
---|---|---|
committer | Jordan Cook <jordan.cook@pioneer.com> | 2022-04-10 17:54:53 -0500 |
commit | 91ac4fdd7d3ca5853d5362d4352bda896220681c (patch) | |
tree | 75f39070cb9794241aeb3823dee1b8f72b8e8361 /requests_cache/backends/sqlite.py | |
parent | b96d9ed4b615e4f6c9d6b4db6679fb843c5319e7 (diff) | |
download | requests-cache-91ac4fdd7d3ca5853d5362d4352bda896220681c.tar.gz |
WIP: Add faster implementation of removing invalid redirects in SQL
Diffstat (limited to 'requests_cache/backends/sqlite.py')
-rw-r--r-- | requests_cache/backends/sqlite.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/requests_cache/backends/sqlite.py b/requests_cache/backends/sqlite.py index 5f4dcfb..dc13144 100644 --- a/requests_cache/backends/sqlite.py +++ b/requests_cache/backends/sqlite.py @@ -143,6 +143,28 @@ class SQLiteCache(BaseCache): return super().remove_expired_responses(expire_after=expire_after) else: self.responses.clear_expired() + self.remove_invalid_redirects() + + def remove_invalid_redirects(self): + # TODO: Benchmark these 2 statements + with self.redirects.connection(commit=True) as conn: + t1 = self.redirects.table_name + t2 = self.responses.table_name + # Option 1 + stmt = ( + f'DELETE FROM {t1} WHERE NOT EXISTS ' + f' (SELECT * FROM {t2} WHERE {t1}.key = {t2}.value)' + ) + + # Option 2 + stmt = ( + f'DELETE FROM {t1} WHERE key IN (' + f' SELECT {t1}.key FROM {t1}' + f' LEFT JOIN {t2} ON {t2}.key = {t1}.value' + f' WHERE {t2}.key IS NULL' + ')' + ) + conn.execute(stmt) class SQLiteDict(BaseStorage): |