Assorted utility functions to support working with SQLAlchemy.
Project description
Assorted utility functions to support working with SQLAlchemy.
Function auto_session(func)
Decorator to run a function in a session is not presupplied.
Function find_json_field(column_value, field_name, *, infill=False)
Descend a JSONable Python object column_value
to field_name
.
Return column_value
(possibly infilled), final_field
, final_field_name
.
This supports database row columns which are JSON columns.
Parameters:
column_value
: the original value of the columnfield_name
: the field within the column to locateinfill
: optional keyword parameter, defaultFalse
. If true,column_value
and its innards will be filled in asdict
s to allow deferencing thefield_name
.
The field_name
is a str
consisting of a period ('.'
) separated sequence of field parts.
Each field part becomes a key to index the column mapping.
These keys are split into the leading field parts
and the final field part,
which is returned as final_field_name
above.
The final_field
return value above
is the mapping within which final_field_value
may lie
and where final_field_value
may be set.
Note: it may not be present.
If a leading key is missing and infill
is true
the corresponding part of the column_value
is set to an empty dictionary
in order to allow deferencing the leading key.
This includes the case when column_value
itself is None
,
which is why the column_value
is part of the return.
If a leading key is missing and infill
is false
this function will raise a KeyError
for the portion of the field_name
which failed.
Examples:
>>> find_json_field({'a':{'b':{}}},'a.b')
({'a': {'b': {}}}, {'b': {}}, 'b')
>>> find_json_field({'a':{}},'a.b')
({'a': {}}, {}, 'b')
>>> find_json_field({'a':{'b':{}}},'a.b.c.d')
Traceback (most recent call last):
...
KeyError: 'a.b.c'
>>> find_json_field({'a':{'b':{}}},'a.b.c.d', infill=True)
({'a': {'b': {'c': {}}}}, {}, 'd')
>>> find_json_field(None, 'a.b.c.d')
Traceback (most recent call last):
...
KeyError: 'a'
>>> find_json_field(None,'a.b.c.d', infill=True)
({'a': {'b': {'c': {}}}}, {}, 'd')
Function get_json_field(column_value, field_name, *, default=None)
Return the value of field_name
from column_value
or a defaault if the field is not present.
Parameters:
column_value
: the original value of the columnfield_name
: the field within the column to locatedefault
: default value to return if the field is not present, default:None
Examples:
>>> get_json_field({'a': 1}, 'a')
1
>>> get_json_field({'b': 1}, 'a')
>>> get_json_field({'a': {}}, 'a.b')
>>> get_json_field({'a': {'b': 2}}, 'a.b')
2
Class ORM
A convenience base class for an ORM class.
This defines a .Base
attribute which is a new DeclarativeBase
and provides various Session related convenience methods.
Subclasses must define their own .Session
factory in
their own __init__
, for example:
self.Session = sessionmaker(bind=engine)
Function orm_auto_session(method)
Decorator to run a method in a session derived from self.orm
if a session is not presupplied.
Intended to assist classes with a .orm
attribute.
Function set_json_field(column_value, field_name, value, *, infill=False)
Set a new value
for field_name
of column_value
.
Return the new column_value
.
Parameters:
column_value
: the original value of the columnfield_name
: the field within the column to locatevalue
: the value to store asfield_name
infill
: optional keyword parameter, defaultFalse
. If true,column_value
and its innards will be filled in asdict
s to allow deferencing thefield_name
.
As with find_json_field
,
a true infill
may modify column_value
to provide field_name
which is why this function returns the new column_value
.
Examples:
>>> set_json_field({'a': 2}, 'a', 3)
{'a': 3}
>>> set_json_field({'a': 2, 'b': {'c': 5}}, 'b.c', 4)
{'a': 2, 'b': {'c': 4}}
>>> set_json_field({'a': 2}, 'b.c', 4)
Traceback (most recent call last):
...
KeyError: 'b'
>>> set_json_field({'a': 2}, 'b.c', 4, infill=True)
{'a': 2, 'b': {'c': 4}}
>>> set_json_field(None, 'b.c', 4, infill=True)
{'b': {'c': 4}}
Function with_session(func, *a, orm=None, session=None, **kw)
Call func(*a,session=session,**kw)
, creating a session if required.
This is the inner mechanism of @auto_session
and
ORM.auto_session_method
.
Parameters:
func
: the function to calla
: the positional parametersorm
: optional ORM class with a.session()
context manager methodsession
: optional existing ORM session
One of orm
or session
must be not None
; if session
is None
then one is made from orm.session()
and used as
a context manager. The session
is also passed to func
as
the keyword parameter session
to support nested calls.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file cs.sqlalchemy_utils-20190526.tar.gz
.
File metadata
- Download URL: cs.sqlalchemy_utils-20190526.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/39.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 995d9b648fb884edd75b4e0563a75fe5e08ff844911bff26e137482595aa5a45 |
|
MD5 | 4788629a15163e5babc461ba5acdbac6 |
|
BLAKE2b-256 | 83b660ede2525dff5835587e9fa33e9fc202d24a82c6d40093414db454d8908f |