Database functions

Simple thread-safe SQLAlchemy wrapper

after initialization, wrapper object contains additional params:

  • name equal to SQLAlchemy engine name
  • use_lastrowid show last row id be used (sqlite, mysql)
  • use_interval can interval columns be used (not available for sqlite, mysql)
  • parse_db_json should JSON column be parsed after selecting (sqlite, mysql)

__str__ and __repr__ methods are mapped to SQLAlchemy engine.

Extra mods required: sqlalchemy, msgpack (for KVStorage)

class pyaltt2.db.Database(dbconn=None, rq_func=None, **kwargs)

Database wrapper for SQLAlchemy

Parameters:
  • dbconn – database connection string (for SQLite - only file name is required)
  • rq_func – resource loader function (for query method)
  • kwargs – additional engine options (ignored for SQLite)
clone(**kwargs)

Clone database object

Extra kwargs (db, db_lock, g, rq_func) are assigned to object as-is

connect()

Get thread-safe db connection

create(q, *args, **kwargs)

Execute (usually INSERT) query with self.execute and return row id

row id must be in “id” field

execute(*args, _cr=False, **kwargs)

Execute SQL query

Parameters:
  • _cr – check result, raise LookupError if row count is zero
  • other – passed to SQLAlchemy connection as-is
get_engine()

Get DB engine object

list(*args, json_fields=[], **kwargs)

get self.execute result as list of dicts

Parameters:
  • json_fields – decode json fields if required
  • other – passed as-is
lookup(*args, json_fields=[], **kwargs)

Get single db row, use self.execute

Parameters:
  • json_fields – decode json fields if required
  • other – passed as-is
Returns:

single row as a dict

Raises:

LookupError – if nothing found

qcreate(q, *args, **kwargs)

Execute (usually INSERT) query with self.query and return row id

row id must be in “id” field

qlist(*args, json_fields=[], **kwargs)

get self.query result as list of dicts

Parameters:
  • json_fields – decode json fields if required
  • other – passed as-is
qlookup(*args, json_fields=[], **kwargs)

Get single db row, use self.query

Returns:single row as a dict
Raises:LookupError – if nothing found
query(q, qargs=[], qkwargs={}, _create=False, *args, **kwargs)

Execute SQL query by resource

Parameters:
  • q – resource name
  • qkwargs (qargs,) – format query with args/kwargs
  • other – passed as-is

Requires rq_func

class pyaltt2.db.KVStorage(db, table_name='kv')

Simple key-value database storage

Parameters:
  • db – pyaltt2.db.Database
  • table_name – storage table name (default: kv)
cleanup()

Deletes expired objects

delete(key)

Delete object in key-value storage

Parameters:key – object key
Raises:LookupError – object not found
get(key, delete=False)

Get object from key-value storage

Parameters:
  • key – object key
  • delete – delete object after getting
Raises:

LookupError – object not found

put(key=None, value=None, expires=None, override=True)

Put object to key-value storage

If no key specified, random 64-char key is generated

Parameters:
  • key – string key (1-255 chars)
  • value – value to put
  • expires – expiration either in seconds or datetime.timedelta
  • override – replace existing object
Returns:

object key

pyaltt2.db.format_condition(f, kw=None, fields=None, cond=None)
Parameters:
  • f – condition filter (dict name/value)
  • kw – kwargs query dict
  • fields – allowed fields
  • cond – initial condition
Returns:

tuple cond (string), kw (dict). String can be safely used in SQL query, dict should be set as query kwargs