Storage
Object properties data is stored into storages. You may define one or multiple storages, each property can be mapped only to the single storage.
E.g. you may store part of the object data into files and some values in RDBMS database.
You may use ready-made storage classes or create your own.
Contents
Defining storages
import smartobject
# define default storage
smartobject.define_storage(smartobject.JSONStorage())
# define another file storage with id "stor2"
storage2 = smartobject.MessagePackStorage()
# raise errors if data file is not found
storage2.allow_empty = False
smartobject.define_storage(storage2, 'stor2')
# define key-value storage with id "redis1"
smartobject.define_storage(smartobject.RedisStorage(), 'redis1')
# get storage object
r = smartobject.get_storage('redis1')
# purge deleted objects in all storages
smartobject.purge()
File-based storage
File-based storages can not handle properties, marked as “external”.
JSON
-
class
smartobject.storage.
JSONStorage
(pretty=False) Bases:
smartobject.storage.AbstractFileStorage
Stores object data in JSON format
Uses rapidjson module if installed, otherwise fallbacks to default
Parameters: pretty – if True, store pretty-formatted JSON (indent, sort keys), default is False -
cleanup
(pks, pattern=None) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete stored object
-
get_prop
(pk, prop, **kwargs) Get single object property from the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
-
list
(pattern=None, **kwargs) List object files in storage
Parameters: pattern – file pattern (default: all files with {self.ext})
-
load
(pk=None, fname=None, allow_empty=None, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(pattern=None, **kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
load_by_prop
(key, prop, **kwargs) Load object data from the storage by secondary key
Parameters: - key – object key value
- prop – object key name
-
prepare_pk
(pk) Converts primary key value to file name
By default, replaces “/” with “___”
-
purge
(**kwargs) Purge deleted objects
-
save
(pk=None, data={}, modified={}, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
set_prop
(pk, prop, value, **kwargs) Save single object property to the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
- value – property value
-
YAML
-
class
smartobject.storage.
YAMLStorage
(pretty=True) Bases:
smartobject.storage.AbstractFileStorage
Stores object data in YAML format
Requires pyyaml module
Args: pretty: if True, store pretty-formatted YAML, default is True
-
cleanup
(pks, pattern=None) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete stored object
-
get_prop
(pk, prop, **kwargs) Get single object property from the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
-
list
(pattern=None, **kwargs) List object files in storage
Parameters: pattern – file pattern (default: all files with {self.ext})
-
load
(pk=None, fname=None, allow_empty=None, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(pattern=None, **kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
load_by_prop
(key, prop, **kwargs) Load object data from the storage by secondary key
Parameters: - key – object key value
- prop – object key name
-
prepare_pk
(pk) Converts primary key value to file name
By default, replaces “/” with “___”
-
purge
(**kwargs) Purge deleted objects
-
save
(pk=None, data={}, modified={}, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
set_prop
(pk, prop, value, **kwargs) Save single object property to the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
- value – property value
-
Pickle
-
class
smartobject.storage.
PickleStorage
Bases:
smartobject.storage.AbstractFileStorage
Stores object data in Python pickle format
-
cleanup
(pks, pattern=None) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete stored object
-
get_prop
(pk, prop, **kwargs) Get single object property from the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
-
list
(pattern=None, **kwargs) List object files in storage
Parameters: pattern – file pattern (default: all files with {self.ext})
-
load
(pk=None, fname=None, allow_empty=None, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(pattern=None, **kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
load_by_prop
(key, prop, **kwargs) Load object data from the storage by secondary key
Parameters: - key – object key value
- prop – object key name
-
prepare_pk
(pk) Converts primary key value to file name
By default, replaces “/” with “___”
-
purge
(**kwargs) Purge deleted objects
-
save
(pk=None, data={}, modified={}, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
set_prop
(pk, prop, value, **kwargs) Save single object property to the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
- value – property value
-
MessagePack
-
class
smartobject.storage.
MessagePackStorage
Bases:
smartobject.storage.AbstractFileStorage
Stores object data in MessagePack format
Requires msgpack-python module
-
cleanup
(pks, pattern=None) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete stored object
-
get_prop
(pk, prop, **kwargs) Get single object property from the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
-
list
(pattern=None, **kwargs) List object files in storage
Parameters: pattern – file pattern (default: all files with {self.ext})
-
load
(pk=None, fname=None, allow_empty=None, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(pattern=None, **kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
load_by_prop
(key, prop, **kwargs) Load object data from the storage by secondary key
Parameters: - key – object key value
- prop – object key name
-
prepare_pk
(pk) Converts primary key value to file name
By default, replaces “/” with “___”
-
purge
(**kwargs) Purge deleted objects
-
save
(pk=None, data={}, modified={}, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
set_prop
(pk, prop, value, **kwargs) Save single object property to the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
- value – property value
-
CBOR
-
class
smartobject.storage.
CBORStorage
Bases:
smartobject.storage.AbstractFileStorage
Stores object data in CBOR format
Requires cbor module
-
cleanup
(pks, pattern=None) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete stored object
-
get_prop
(pk, prop, **kwargs) Get single object property from the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
-
list
(pattern=None, **kwargs) List object files in storage
Parameters: pattern – file pattern (default: all files with {self.ext})
-
load
(pk=None, fname=None, allow_empty=None, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(pattern=None, **kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
load_by_prop
(key, prop, **kwargs) Load object data from the storage by secondary key
Parameters: - key – object key value
- prop – object key name
-
prepare_pk
(pk) Converts primary key value to file name
By default, replaces “/” with “___”
-
purge
(**kwargs) Purge deleted objects
-
save
(pk=None, data={}, modified={}, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
set_prop
(pk, prop, value, **kwargs) Save single object property to the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
- value – property value
-
Database storages
RDBMS
SQLAlchemy-based storage.
-
class
smartobject.storage.
SQLAStorage
(db, table, pk_field='id') Bases:
smartobject.storage.AbstractStorage
RDBMS storage via SQLAlchemy
Implements get_prop/set_prop methods, can be used for external properties
Can save/load objects
The table for objects must be created manually before the class methods can work
Parameters: - db – either SQLAlchemy instance, which implements “execute” method (engine, connection) or callable (function) which returns such instance on demand
- table – database table
- pk_field – primary key field in table (default: id)
-
cleanup
(pks, **kwargs) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete object data from the storage
Parameters: - pk – object primary key
- props – list of object properties mapped to store
-
get_prop
(pk, prop, **kwargs) Get single object property from the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
-
load
(pk, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(**kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
load_by_prop
(key, prop, **kwargs) Load object data from the storage by secondary key
Parameters: - key – object key value
- prop – object key name
-
purge
(**kwargs) Purge deleted objects
-
save
(pk=None, data={}, modified={}, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
set_prop
(pk, prop, value, **kwargs) Save single object property to the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
- value – property value
Key-value
Redis-based storage.
-
class
smartobject.storage.
RedisStorage
(host='localhost', port=6379, db=0, prefix='', **kwargs) Bases:
smartobject.storage.AbstractStorage
Redis storage
Implements get_prop/set_prop methods, can be used for external properties
Can not save/load objects
Stores object properties in format {pk}/{prop}
Deletes properties from Redis server when object is deleted
Parameters: - host – Redis host
- port – Redis port
- db – Redis DB ID
- prefix – record prefix
- **kwargs – passed to Python redis module as-is
-
cleanup
(pks, **kwargs) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete object data from the storage
Parameters: - pk – object primary key
- props – list of object properties mapped to store
-
get_prop
(pk, prop, **kwargs) Get single object property from the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
-
load
(pk, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(**kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
load_by_prop
(key, prop, **kwargs) Load object data from the storage by secondary key
Parameters: - key – object key value
- prop – object key name
-
purge
(**kwargs) Purge deleted objects
-
save
(pk, data, modified, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
set_prop
(pk, prop, value, **kwargs) Save single object property to the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
- value – property value
Custom storages
You may use the following classes as prototypes for the own storages:
-
class
smartobject.storage.
AbstractStorage
Bases:
object
Abstract storage class which can be used as storage template
-
cleanup
(pks, **kwargs) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete object data from the storage
Parameters: - pk – object primary key
- props – list of object properties mapped to store
-
get_prop
(pk, prop, **kwargs) Get single object property from the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
-
load
(pk, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(**kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
load_by_prop
(key, prop, **kwargs) Load object data from the storage by secondary key
Parameters: - key – object key value
- prop – object key name
-
purge
(**kwargs) Purge deleted objects
-
save
(pk, data, modified, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
set_prop
(pk, prop, value, **kwargs) Save single object property to the storage
Must be implemented if external properties are mapped
Parameters: - pk – object primary key
- prop – object property
- value – property value
-
-
class
smartobject.storage.
AbstractFileStorage
Bases:
smartobject.storage.AbstractStorage
Abstract class for file-based storages
Has the following properties:
allow_empty: if no object data file is found, return empty data (defalt: True)
instant_delete: delete object files instantly (default: True)
File-based storages usually don’t implement get_prop/set_prop methods
File-based storages have additional “fname” property for load() method
-
cleanup
(pks, pattern=None) Cleanup storage
Deletes from storage all items which are not in provided list of primary keys
Parameters: pks – list of primary keys Returns: number of deleted items
-
delete
(pk, props, **kwargs) Delete stored object
-
list
(pattern=None, **kwargs) List object files in storage
Parameters: pattern – file pattern (default: all files with {self.ext})
-
load
(pk=None, fname=None, allow_empty=None, **kwargs) Load object data from the storage
Parameters: pk – object primary key
-
load_all
(pattern=None, **kwargs) Load object data for all objecta and return it as list generator
- Each object in list is a dictionary with fields:
- data: object data info: additional info, e.g. fname the data is loaded from
info is passed to object after_load() method as kwargs
-
prepare_pk
(pk) Converts primary key value to file name
By default, replaces “/” with “___”
-
purge
(**kwargs) Purge deleted objects
-
save
(pk=None, data={}, modified={}, **kwargs) Save object data to the storage
Parameters: - pk – object primary key
- data – full object data
- modified – modified properties only
Returns: object primary key
-
Loading all objects from storage
Sometimes it’s useful to preload all objects of the certain type. To make this possible, storages have load_all() method, which returns data for all objects in the specified storage.
The data is returned as list generator, where each item is a dict with fields “data” - contains object data, and “info” - contains additional object info (e.g. file name the object is loaded from). “info” usually should be passed to object after_load() method as kwargs.
SmartObject factory allows to do this in a few lines of code:
factory = smartobject.SmartObjectFactory(MyObjClass, autosave=True)
# if no storage_id arg is specified, objects are loaded from the default
# storage
factory.load_all()
Auto-generated primary keys
Both RDBMS and file storages support auto-generated primary keys. For RDBMS, keys are generated by SQL server (key is auto-incremented integer field). For file storages, key are generated as UUIDs.
When object with null primary key field is being saved for the first time, SmartObject tries to obtain and set primary key field from storage.
To simplify this, you may create SmartObject factory with autosave=True argument: all objects, created by this factory, will be auto-saved as soon as created.
factory = smartobject.SmartObjectFactory(MyObjClass, autosave=True)
# the new object is automatically saved and its primary key is set from the
# storage
obj = factory.create()
Storage cleanup
Sometimes storage may contain orphaned objects. To clean them, it has cleanup(pks) method, where pks is a list of object primary keys to leave, while all other objects will be removed.
if you use SmartObject factory, you may use its cleanup(storage_id) method as well. The method removes all objects from the specified storage, except the objects in factory.