Skip to main content

Python ul db utils

Project description

Generic library db-utils

Provides common database-related functionality that can be used across different services.

Contains all database-related packages as dependencies. If you need to use some package that is not available in your service, you should add it here.

Common functionality

This section describes some classes or methods that are awailable for use in all services that use db-utils.

CustomQuery

As a default this class inherit from flask_sqlalchemy BaseQuery and adds additional filters.

  1. Filtering by only non-deleted (marked as is_alive=True) records.
  2. Joining with/without deleted (marked as is_alive=False) records.

If you want to add some additional by-default behavior to all services than you have to add it here.

transaction_commit

This context manager allows us to perform a database transaction at ORM level. You should use it like this:

with transaction_commit():
  query.perform(something)

Abstract models

This section describes all available abstract models from which we can inherit in our services.

BaseModel

class BaseModel(DbModel, SerializerMixin):

    __abstract__ = True

    query_class = CustomQuery

    id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    date_created = db.Column(db.DateTime(), default=datetime.utcnow(), nullable=False)
    date_modified = db.Column(db.DateTime(), default=datetime.utcnow(), nullable=False)
    is_alive = db.Column(db.Boolean(), default=True, nullable=False)

Provides UUID, record creation/modification datetime and is_alive field used for soft-deletion.

BaseUndeletableModel

class BaseUndeletableModel(DbModel, SerializerMixin):

    __abstract__ = True

    query_class = BaseQuery

    id = db.Column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    date_created = db.Column(db.DateTime(), default=datetime.utcnow(), nullable=False)
    date_modified = db.Column(db.DateTime(), default=datetime.utcnow(), nullable=False)

The same thing as BaseModel but models that will inherit from this model won't be able to soft-delete records.

BaseMaterializedPGViewModel

class BaseMaterializedPGView(DbModel, SerializerMixin):
    id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    last_refresh_date = db.Column(db.DateTime(), nullable=False)

    sql = ''
    refresh_by_tables: List[str] = []

    query_class = BaseQuery

    __table_args__ = {'info': {'skip_autogenerate': True}}

    _index_format = '{table}_{field}_index'
    _pkey_format = '{table}_pkey'

    __abstract__ = True

Provides a way to create materialized views in PostgreSQL, add indexes, triggers, etc.

BaseImmutableModel

class BaseImmutableModel(DbModel, SerializerMixin):
    __abstract__ = True

    query_class = BaseQuery

    id = db.Column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    date_created = db.Column(db.DateTime(), default=datetime.utcnow(), nullable=False)
    user_created_id = db.Column(PG_UUID(as_uuid=True), nullable=False)

Models that are going to inherit from this one won't have update record functionality.

ApiUser

class ApiUser(BaseModel):
    __tablename__ = 'api_user'

    date_expiration = db.Column(db.DateTime(), nullable=False)
    name = db.Column(db.String(255), unique=True, nullable=False)
    note = db.Column(db.Text(), nullable=False)
    permissions = db.Column(ARRAY(db.Integer()), nullable=False)

Every APIUser Model record has an array of permissions.

Exceptions

Exception Desription
ComparisonToNullError Raised when a client attempts to use a filter object that compares a resource's attribute to NULL using == operator instead of using is_null.
DBFiltersError Raised when a client attempts to filter with invalid query params.
DBSortError Raised when a client attempts to sort with invalid query params.
MultipleObjectsReturnedError When only one object expected to be returned, but DB returned multiple objects.
UnknownFieldError When user tries to reference the non-existent model field.
DeletionNotAllowedError Raised when db obj deletion not allowed.
UpdateColumnNotAllowedError Raised when db table column update not allowed.
UpdateNotAllowedError Raised when db table update not allowed.
DbError Generic DB error.

Adding new database-related package

First, try to understand why do you need this library and what exactly can you do with it. Look at the list of already existing libraries and think if they can fulfill your needs.

Check this library for deprecation, does it have enough maintenance, library dependencies. If all above satisfies you, perform next steps:

  1. Add the package name and version to Pipfile under [packages] section. Example: alembic = "==1.8.1".
  2. Run pipenv install.
  3. Add the package name and version to setup.py to install-requires section.
  4. Commit changes. git commit -m "Add dependency *library-name*".
  5. Run version patch: pipenv run version_patch.
  6. Push changes directly to dev git push origin dev --tags or raise MR for your changes to be reviewed.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ul-db-utils-3.3.7.tar.gz (37.0 kB view details)

Uploaded Source

Built Distribution

ul_db_utils-3.3.7-py3-none-any.whl (65.3 kB view details)

Uploaded Python 3

File details

Details for the file ul-db-utils-3.3.7.tar.gz.

File metadata

  • Download URL: ul-db-utils-3.3.7.tar.gz
  • Upload date:
  • Size: 37.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.9

File hashes

Hashes for ul-db-utils-3.3.7.tar.gz
Algorithm Hash digest
SHA256 346cf30267fab3099713b514e50d52c0a67b3e2634673ad0a02c123d700b873a
MD5 e1f122ad9d4b749254193cbd8d1ba100
BLAKE2b-256 ea77b4f4a7a189637d75d92f4b7692111174e9b129272ce6be4af533fa09890e

See more details on using hashes here.

File details

Details for the file ul_db_utils-3.3.7-py3-none-any.whl.

File metadata

  • Download URL: ul_db_utils-3.3.7-py3-none-any.whl
  • Upload date:
  • Size: 65.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.9

File hashes

Hashes for ul_db_utils-3.3.7-py3-none-any.whl
Algorithm Hash digest
SHA256 cafa1ab7443f8d1921a9eade39a9731a1a9c5f299a911ec4f99db59ec8c2f119
MD5 06f7339614b9ef83f63dd1c5d5f8d503
BLAKE2b-256 12642297d6616fdbc59498d64ae08d092e146cad8fd61b640c34de70eff4fa95

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page