Skip to main content

Simplified Database ORM Connections

Project description

ddcDatabases

Donate License: MIT PyPi PyPI Downloads codecov CI/CD Pipeline Quality Gate Status
Build Status Code style: black Python

Support me on GitHub

A Python library for database connections and ORM queries with support for multiple database engines including SQLite, PostgreSQL, MySQL, MSSQL, Oracle, and MongoDB.

Table of Contents

Features

  • Multiple Database Support: SQLite, PostgreSQL, MySQL, MSSQL, Oracle, and MongoDB
  • Sync and Async Support: Both synchronous and asynchronous operations
  • Environment Configuration: Optional parameters with .env file fallback
  • SQLAlchemy Integration: Built on top of SQLAlchemy ORM
  • Connection Pooling: Configurable connection pooling for better performance

Default Session Settings

  • autoflush = False
  • expire_on_commit = False
  • echo = False

Note: All constructor parameters are optional and fall back to .env file variables.

Installation

Basic Installation (SQLite only)

pip install ddcDatabases

Note: The basic installation includes only SQlite. Database-specific drivers are optional extras that you can install as needed.

Database-Specific Installations

Install only the database drivers you need:

# All database drivers (recommended for development)
pip install ddcDatabases[all]

# SQL Server / MSSQL
pip install ddcDatabases[mssql]

# MySQL / MariaDB
pip install ddcDatabases[mysql]

# PostgreSQL
pip install ddcDatabases[pgsql]

# Oracle Database
pip install ddcDatabases[oracle]

# MongoDB
pip install ddcDatabases[mongodb]

# Multiple databases (example)
pip install ddcDatabases[mysql,pgsql,mongodb]

Available Database Extras:

  • all - All database drivers
  • mssql - Microsoft SQL Server (pyodbc, aioodbc)
  • mysql - MySQL/MariaDB (pymysql, aiomysql)
  • pgsql - PostgreSQL (psycopg2-binary, asyncpg)
  • oracle - Oracle Database (cx-oracle)
  • mongodb - MongoDB (pymongo)

Platform Notes:

  • SQLite support is included by default (no extra installation required)
  • PostgreSQL extras may have compilation requirements on some systems
  • All extras support both synchronous and asynchronous operations where applicable

Database Classes

SQLite

Example:

import sqlalchemy as sa
from ddcDatabases import DBUtils, Sqlite
from your_models import Model  # Your SQLAlchemy model

with Sqlite(filepath="data.db") as session:
    db_utils = DBUtils(session)
    stmt = sa.select(Model).where(Model.id == 1)
    results = db_utils.fetchall(stmt)
    for row in results:
        print(row)

MSSQL (SQL Server)

Synchronous Example:

import sqlalchemy as sa
from ddcDatabases import DBUtils, MSSQL
from your_models import Model

kwargs = {
    "host": "127.0.0.1",
    "port": 1433,
    "user": "sa",
    "password": "password",
    "database": "master",
    "db_schema": "dbo",
    "echo": True,
    "autoflush": True,
    "expire_on_commit": True,
    "autocommit": True,
    "connection_timeout": 30,
    "pool_recycle": 3600,
    "pool_size": 25,
    "max_overflow": 50,
}

with MSSQL(**kwargs) as session:
    stmt = sa.select(Model).where(Model.id == 1)
    db_utils = DBUtils(session)
    results = db_utils.fetchall(stmt)
    for row in results:
        print(row)

Asynchronous Example:

import asyncio
import sqlalchemy as sa
from ddcDatabases import DBUtilsAsync, MSSQL
from your_models import Model

async def main():
    async with MSSQL(**kwargs) as session:
        stmt = sa.select(Model).where(Model.id == 1)
        db_utils = DBUtilsAsync(session)
        results = await db_utils.fetchall(stmt)
        for row in results:
            print(row)
asyncio.run(main())

PostgreSQL

Synchronous Example:

import sqlalchemy as sa
from ddcDatabases import DBUtils, PostgreSQL
from your_models import Model

kwargs = {
    "host": "127.0.0.1",
    "port": 5432,
    "user": "postgres",
    "password": "postgres",
    "database": "postgres",
    "echo": True,
    "autoflush": False,
    "expire_on_commit": False,
    "autocommit": True,
    "connection_timeout": 30,
    "pool_recycle": 3600,
    "pool_size": 25,
    "max_overflow": 50,
}

with PostgreSQL(**kwargs) as session:
    stmt = sa.select(Model).where(Model.id == 1)
    db_utils = DBUtils(session)
    results = db_utils.fetchall(stmt)
    for row in results:
        print(row)

Asynchronous Example:

import asyncio
import sqlalchemy as sa
from ddcDatabases import DBUtilsAsync, PostgreSQL
from your_models import Model

async def main():
    async with PostgreSQL(**kwargs) as session:
        stmt = sa.select(Model).where(Model.id == 1)
        db_utils = DBUtilsAsync(session)
        results = await db_utils.fetchall(stmt)
        for row in results:
            print(row)
asyncio.run(main())

MySQL

Synchronous Example:

import sqlalchemy as sa
from ddcDatabases import DBUtils, MySQL

kwargs = {
    "host": "127.0.0.1",
    "port": 3306,
    "user": "root",
    "password": "root",
    "database": "dev",
    "echo": True,
    "autoflush": False,
    "expire_on_commit": False,
    "autocommit": True,
    "connection_timeout": 30,
    "pool_recycle": 3600,
    "pool_size": 25,
    "max_overflow": 50,
}

with MySQL(**kwargs) as session:
    stmt = sa.text("SELECT * FROM users WHERE id = 1")
    db_utils = DBUtils(session)
    results = db_utils.fetchall(stmt)
    for row in results:
        print(row)

Asynchronous Example:

import asyncio
import sqlalchemy as sa
from ddcDatabases import DBUtilsAsync, MySQL
async def main() -> None:
    async with MySQL(**kwargs) as session:
        stmt = sa.text("SELECT * FROM users")
        db_utils = DBUtilsAsync(session)
        results = await db_utils.fetchall(stmt)
        for row in results:
            print(row)
asyncio.run(main())

Oracle

Example with explicit credentials:

import sqlalchemy as sa
from ddcDatabases import DBUtils, Oracle

kwargs = {
    "host": "127.0.0.1",
    "port": 1521,
    "user": "system",
    "password": "oracle",
    "servicename": "xe",
    "echo": False,
    "autoflush": False,
    "expire_on_commit": False,
    "autocommit": True,
    "connection_timeout": 30,
    "pool_recycle": 3600,
    "pool_size": 25,
    "max_overflow": 50,
}

with Oracle(**kwargs) as session:
    stmt = sa.text("SELECT * FROM dual")
    db_utils = DBUtils(session)
    results = db_utils.fetchall(stmt)
    for row in results:
        print(row)

MongoDB

Example with explicit credentials:

from ddcDatabases import MongoDB
from bson.objectid import ObjectId

kwargs = {
    "host": "127.0.0.1",
    "port": 27017,
    "user": "admin",
    "password": "admin",
    "database": "admin",
    "collection": "test_collection",
    "sort_column": "_id",
    "sort_order": "asc", # asc or desc
}

query = {"_id": ObjectId("689c9f71dd642a68cfc60477")}
with MongoDB(**kwargs, query=query) as cursor:
    for each in cursor:
        print(each)

Database Engines

Access the underlying SQLAlchemy engine for advanced operations:

Synchronous Engine:

from ddcDatabases import PostgreSQL

with PostgreSQL() as session:
    engine = session.bind
    # Use engine for advanced operations

Asynchronous Engine:

from ddcDatabases import PostgreSQL

async def main():
    async with PostgreSQL() as session:
        engine = session.bind
        # Use engine for advanced operations

Database Utilities

The DBUtils and DBUtilsAsync classes provide convenient methods for common database operations:

Available Methods

from ddcDatabases import DBUtils, DBUtilsAsync

# Synchronous utilities
db_utils = DBUtils(session)
results = db_utils.fetchall(stmt)           # Returns list of RowMapping objects
value = db_utils.fetchvalue(stmt)           # Returns single value as string
db_utils.insert(stmt)                       # Insert into model table
db_utils.deleteall(model)                   # Delete all records from model
db_utils.insertbulk(model, data_list)      # Bulk insert from list of dictionaries
db_utils.execute(stmt)                      # Execute any SQLAlchemy statement

# Asynchronous utilities (similar interface with await)
db_utils_async = DBUtilsAsync(session)
results = await db_utils_async.fetchall(stmt)

Logging

import logging
logging.getLogger('ddcDatabases').setLevel(logging.INFO)
logging.getLogger('ddcDatabases').addHandler(logging.StreamHandler())

Development

Building from Source

poetry build -f wheel

Running Tests

poetry update --with test
poe tests

License

Released under the MIT License

Support

If you find this project helpful, consider supporting development:

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

ddcdatabases-2.0.6.tar.gz (17.0 kB view details)

Uploaded Source

Built Distributions

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

ddcdatabases-2.0.6-cp313-cp313-win_amd64.whl (18.4 kB view details)

Uploaded CPython 3.13Windows x86-64

ddcdatabases-2.0.6-cp313-cp313-manylinux_2_39_x86_64.whl (18.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

ddcdatabases-2.0.6-cp313-cp313-macosx_15_0_arm64.whl (18.3 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

ddcdatabases-2.0.6-cp313-cp313-macosx_14_0_arm64.whl (18.3 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

ddcdatabases-2.0.6-cp312-cp312-win_amd64.whl (18.4 kB view details)

Uploaded CPython 3.12Windows x86-64

ddcdatabases-2.0.6-cp312-cp312-manylinux_2_39_x86_64.whl (18.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

ddcdatabases-2.0.6-cp312-cp312-macosx_15_0_arm64.whl (18.3 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

ddcdatabases-2.0.6-cp312-cp312-macosx_14_0_arm64.whl (18.3 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

File details

Details for the file ddcdatabases-2.0.6.tar.gz.

File metadata

  • Download URL: ddcdatabases-2.0.6.tar.gz
  • Upload date:
  • Size: 17.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for ddcdatabases-2.0.6.tar.gz
Algorithm Hash digest
SHA256 43c5d19012b93409c88999f54ac37aea287ed7b62cf709afb4771c28d8aeefa6
MD5 bfb0709534f1f55b58ca2e4d745908bb
BLAKE2b-256 6a77233ef965ceecacccca2a0a66fdf445a45c1abf42e00b4f12037f269011a1

See more details on using hashes here.

File details

Details for the file ddcdatabases-2.0.6-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for ddcdatabases-2.0.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 49f05cb1cc6f85517bee88b28ed5e581dbf263c1a8062d36e519b112599ce7ee
MD5 2da6eb3970496bae55e244b9c08fac07
BLAKE2b-256 7bc536daf6e0541eb23b3903aabc63f474408adba726640361c1c8871179ca4f

See more details on using hashes here.

File details

Details for the file ddcdatabases-2.0.6-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ddcdatabases-2.0.6-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 58f6abccf8e5a0b9decda77ba7fba41eaf963d6ab692b87a350c798dc657c369
MD5 0741aa5c37ecde800ef504fb157edae3
BLAKE2b-256 12b675488b85b28d16c21595132dfc41910510ed21992430df5c5dd6af4238fd

See more details on using hashes here.

File details

Details for the file ddcdatabases-2.0.6-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for ddcdatabases-2.0.6-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 2ce786d32b69c9724d222cd57b95e137b203b07032eda1f3531eab868e3a8356
MD5 245800d8b60173a8507114166417245d
BLAKE2b-256 1fb9235de7225f78dfc1bd63fe6f8f2a16c670bd2ebbc60a075a75869ae0db8c

See more details on using hashes here.

File details

Details for the file ddcdatabases-2.0.6-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for ddcdatabases-2.0.6-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 0a05945a2a62b6d6fe9508074f121acde6fdf956932bfa830e3b8a2541c988b8
MD5 6367a1d9b7273a683c3260112fcb2520
BLAKE2b-256 f3ec1442a06218dca4bef2573db3498f4a4da7d79a313efb17044becf4db708f

See more details on using hashes here.

File details

Details for the file ddcdatabases-2.0.6-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for ddcdatabases-2.0.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f5baee4b6040998bef38906c14421e377635313dfe536c76b77fde5736191545
MD5 919c5f6d0abbffd4f647b28fc2997297
BLAKE2b-256 3571bd40029aca63c592d601d6977541892c51a9ea2aa31c479dc0f841f4fe26

See more details on using hashes here.

File details

Details for the file ddcdatabases-2.0.6-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ddcdatabases-2.0.6-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 6895b1d66002bebfaa4005d4828eb01fd73475c15d86bb142234dae666b761c2
MD5 587be71b0a39947e8f42a3a7a2c3444a
BLAKE2b-256 0bc56f37a8d943b74317d0c00c982a317d96051357f2ad20f89e037b31a06ce9

See more details on using hashes here.

File details

Details for the file ddcdatabases-2.0.6-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for ddcdatabases-2.0.6-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c0538a43c1ba34fc9e2a859cc9005461663d6c5ad387b6de09426a22fe528b1d
MD5 b6f42128399d1721df0ebd54829cd95b
BLAKE2b-256 49c2ea858d7ea968319ec62a943a77ed4906090e7f627a4ee7153edf8caa8774

See more details on using hashes here.

File details

Details for the file ddcdatabases-2.0.6-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for ddcdatabases-2.0.6-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 5fc3fa2983da7f2b86c74a76aa007594a760a9facda1062e69b35159e7c82271
MD5 c2919ed11c8c0e1d6e3d5e51ef31cb3d
BLAKE2b-256 8dbaf4d4b63d6bfe4b278b4effab2bf3722f0e9e309b56db688916e04a88a24d

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