Created
April 20, 2025 17:24
-
-
Save matthewfl/04895f018c95d9f29cddc3b69e7309e2 to your computer and use it in GitHub Desktop.
Pickle SQL dict for python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sqlite3 | |
import zlib | |
import pickle | |
class PickleSQLDict: | |
def __init__(self, filename): | |
self._filename = filename | |
self.__db = None | |
@property | |
def _db(self): | |
if self.__db is not None: | |
return self.__db | |
self.__db = sqlite3.connect(self._filename, isolation_level=None, timeout=3600) | |
self.__db.execute('create table if not exists d (key blob primary key, value blob)') | |
self.__db.execute('PRAGMA synchronous = off') | |
return self.__db | |
def __setitem__(self, key, value): | |
k = pickle.dumps(key) | |
v = zlib.compress(pickle.dumps(value)) | |
self._db.execute('insert into d (key,value) values ($0,$1) on conflict (key) do update set value=excluded.value;', (k, v,)) | |
def __getitem__(self, key): | |
k = pickle.dumps(key) | |
for row in self._db.execute('select value from d where key = $1 limit 1', (k,)): | |
return pickle.loads(zlib.decompress(row[0])) | |
raise KeyError(key) | |
def __delitem__(self, key): | |
k = pickle.dumps(key) | |
self._db.execute('delete from d where key = $1', (k,)) | |
def __contains__(self, key): | |
k = pickle.dumps(key) | |
for row in self._db.execute('select exists(select 1 from d where key = $1)', (k,)): | |
return row[0] | |
def keys(self): | |
for row in self._db.execute('select key from d'): | |
yield pickle.loads(row[0]) | |
def __getstate__(self): | |
return (self._filename,) | |
def __setstate__(self, t): | |
self._filename = t[0] | |
self.__db = None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment