Skip to main content

A simple MariaDB/Postgres client based on SQLAlchemy core

Project description

dbmasta (simple mariadb/postgres interface)

Overview

This Python package provides a simple interface for interacting with MariaDB databases using SQLAlchemy Core. It abstracts some common database operations into more manageable Python methods, allowing for easy database queries, inserts, updates, and deletes.

Installation

To install this package, run the following pip command. Note: this requires SQLAlchemy 2.0.27 or greater

pip install dbmasta

Basic Usage

Configuration

First, configure the database client with the necessary credentials:

from dbmasta import DataBase, AsyncDataBase

# Initialize the database client
db = DataBase(
    dict(
        username='username', 
        password='password', 
        host='host', 
        port=3306, 
        default_database='database_name'
        )
    )
# Async Version
db = AsyncDataBase(
    dict(
        username='username', 
        password='password', 
        host='host', 
        port=3306, 
        default_database='database_name'
        )
    )


# Initiliaze using environment variables
db = DataBase.env()
# Async Version
db = AsyncDataBase.env()

Executing Queries

You can execute a simple SELECT query to fetch data:

import datetime as dt

# Create parameters
params = {
    "date": db.before(dt.date(2024,1,1), inclusive=True)
}

# Execute the query
dbr = db.select("database", "table", params)

# Examine the results
if dbr.successful:
    print(dbr.records)
else:
    print(dbr.error_info)

Complex Queries

The following query would generate this text:

import datetime as dt

# Create parameters
params = {
    "_OR_": db.or_(
        [
            {"date": db.after(dt.date(2020,1,1)), "category": "sales"},
            {"date": db.before(dt.date(2020,1,1)), "category": db.not_(db.in_, ["purchases","adjustments","sales"])},
        ]
    ),
    "_AND_": db.and_(
        [
            {"keyfield": db.starts_with("SJ")},
            {"keyfield": db.not_(db.ends_with("2E"))}
        ]
    )
    "status": "under_review"
}

# Execute the query
dbr = db.select("database", "table", params)

# Examine the results
if dbr.successful:
    print(dbr.records)
else:
    print(dbr.error_info)

The raw text of the query can be retrieved from the attribute dbr.raw_query from the DataBaseResponse object, which the DataBase.select method returns. The text in the above example would be as follows:

SELECT * FROM `database`.`table`
WHERE ((`date` > '2020-01-01' and `category`='sales') or 
(`date` < '2020-01-01' and `category` not in ('sales')))
AND `keyfield` LIKE 'SJ%' AND `keyfield` NOT LIKE '%2E'
AND `status`='under_review';

Or in simple terms... Get all records under_review where the keyfield starts with SJ, but doesn't end with 2E. Pull these if either:

  • dated after 2020-01-01 and categorized as a sale
  • dated before 2020-01-01 and not categorized as sale,purchase or adjustment.

Result Modification from DataBase.select

In addition to complex conditions for filtering records, you can:

  • sort records

    db.select(..., order_by="column_name", reverse=True)
    
  • limit and offset results

    # for offset pagination
    db.select(..., limit=100, offset=0)
    
  • filter columns

    # only receive the data for the fields you provide
    db.select(..., columns=["keyfield", "name", "date"])
    
  • get textual output (without executing)

    # this will not execute the query, but will return the raw query needed to execute
    raw_textual_query = db.select(..., textual=True)
    print(raw_textual_query)
    new_query = f"INSERT INTO `filteredtable` ({raw_textual_query[:-1]});
    dbr = db.run(new_query)
    
  • get model output by providing a model factory

    from pydantic import BaseModel
    import datetime as dt
    
    class Record(BaseModel):
        keyfield: str
        date: dt.date
        status: str
    
    model_factory = lambda row: Record(**row)
    
    # only receive the data for the fields you provide
    dbr = db.select(..., response_model=model_factory)
    # each record will be an instance of Record
    

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

dbmasta-0.1.23.tar.gz (33.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dbmasta-0.1.23-py3-none-any.whl (40.0 kB view details)

Uploaded Python 3

File details

Details for the file dbmasta-0.1.23.tar.gz.

File metadata

  • Download URL: dbmasta-0.1.23.tar.gz
  • Upload date:
  • Size: 33.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for dbmasta-0.1.23.tar.gz
Algorithm Hash digest
SHA256 5d8ee3cd850f3a24923d39b32b7992fb3e9b6a0bfb2be7fd04973d6e9558e641
MD5 b9c457c8b85e7ecd1da1b9ebdff0a420
BLAKE2b-256 a2471df0ef1b35af2a73ad7f347c2def27081445f9b881c48a7cdcb5550e237d

See more details on using hashes here.

File details

Details for the file dbmasta-0.1.23-py3-none-any.whl.

File metadata

  • Download URL: dbmasta-0.1.23-py3-none-any.whl
  • Upload date:
  • Size: 40.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for dbmasta-0.1.23-py3-none-any.whl
Algorithm Hash digest
SHA256 614001914a93392b131074eab1c0b0d76a4ca6c66f1401d5acc929462081bc61
MD5 75cca0dab2929746f5401343e952995e
BLAKE2b-256 0c1586348cabc6f3e339ebe14ccf0ae84264c2ef02bf6845c7b5e8e81d6545cd

See more details on using hashes here.

Supported by

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