Source code for bw2data.sqlite
import json
import pickle
from peewee import BlobField, SqliteDatabase, TextField
[docs]class PickleField(BlobField):
[docs] def db_value(self, value):
return super(PickleField, self).db_value(pickle.dumps(value, protocol=4))
[docs] def python_value(self, value):
return pickle.loads(bytes(value))
[docs]class SubstitutableDatabase:
def __init__(self, filepath, tables):
self._filepath = filepath
self._tables = tables
self._database = self._create_database()
[docs] def _create_database(self):
db = SqliteDatabase(self._filepath)
for model in self._tables:
model.bind(db, bind_refs=False, bind_backrefs=False)
db.connect()
db.create_tables(self._tables)
return db
@property
[docs] def db(self):
return self._database
[docs] def change_path(self, filepath):
self.db.close()
self._filepath = filepath
self._database = self._create_database()
[docs] def atomic(self):
return self.db.atomic()
[docs] def execute_sql(self, *args, **kwargs):
return self.db.execute_sql(*args, **kwargs)
[docs] def transaction(self):
return self.db.transaction()
[docs] def vacuum(self):
print("Vacuuming database ")
self.execute_sql("VACUUM;")
[docs]class JSONField(TextField):
"""Simpler JSON field that doesn't support advanced querying and is human-readable"""
[docs] def db_value(self, value):
return super().db_value(
json.dumps(
value,
ensure_ascii=False,
indent=2,
default=lambda x: x.isoformat() if hasattr(x, "isoformat") else x,
)
)
[docs] def python_value(self, value):
return json.loads(value)
[docs]class TupleJSONField(JSONField):
[docs] def python_value(self, value):
data = json.loads(value)
if isinstance(data, list):
data = tuple(data)
return data