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.7.tar.gz (17.6 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.7-cp313-cp313-win_amd64.whl (18.9 kB view details)

Uploaded CPython 3.13Windows x86-64

ddcdatabases-2.0.7-cp313-cp313-manylinux_2_39_x86_64.whl (18.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

ddcdatabases-2.0.7-cp313-cp313-macosx_15_0_arm64.whl (18.7 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

ddcdatabases-2.0.7-cp313-cp313-macosx_14_0_arm64.whl (18.7 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

ddcdatabases-2.0.7-cp312-cp312-win_amd64.whl (18.9 kB view details)

Uploaded CPython 3.12Windows x86-64

ddcdatabases-2.0.7-cp312-cp312-manylinux_2_39_x86_64.whl (18.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

ddcdatabases-2.0.7-cp312-cp312-macosx_15_0_arm64.whl (18.7 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

ddcdatabases-2.0.7-cp312-cp312-macosx_14_0_arm64.whl (18.7 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

File details

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

File metadata

  • Download URL: ddcdatabases-2.0.7.tar.gz
  • Upload date:
  • Size: 17.6 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.7.tar.gz
Algorithm Hash digest
SHA256 c397dc49e4910ec50cc903b3ca652b0a4b705d474a43a8211f3a17f6a047f529
MD5 9091640ee091770e9bb043501187b982
BLAKE2b-256 b75c1f7172fa6058540d1029698bb32f13327937e4a706a75e43b22175bd64a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 81283c35e4bfac40c7dcbe4cac51b51355e99264093ccdd8fba70d5e875adf3a
MD5 2e642dadb97aa577ececc99f28b80de5
BLAKE2b-256 77b45f3536c49cc4cbfbd5ab29ae60abcf93c35ebf3ad0251c1249a7d32557e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.7-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 e9d8911ee245ec79324f66fa9ae85d82c436916f344d8d5a13fcc57af8bb87b1
MD5 d90f6034576ca0bd0ac3c6d40c7d739f
BLAKE2b-256 a6a3e6f83f3331290b66bb9659ab6b8f1eaa85445cdcb7418ce9dfb6fedf48c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.7-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 6fd5d41aecfbd285957e34966d574998676ebc09dfb3e400b94d1845fc5ef6f4
MD5 8cafcc313cfbc336e0f138450908908f
BLAKE2b-256 b77d479b7dc326395b65877bd0cc831beab912822d798ae7cbfc658263022b09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.7-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7ee377e8de286b7ab0be9769df2d821e0d720cea4d977111580be613df45166c
MD5 030cd6733a497c87bb552ff39bb450ca
BLAKE2b-256 e24151d10eaaa3e96e62382d0a7eee061dea4bc718e1cd4073d84beece1ba949

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c25037cfbb4ee939c5e95f426de7416c43c393e7deab3b8e17210d7f2ce76473
MD5 2a2f98f90c76d8452cc984e8cc07d0f7
BLAKE2b-256 b9a1df1271cbce8db1ae45c8b4b714f077f6c0b6194705be87290f581fda561f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.7-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 e36ef7f8fc645b75d68f0daab1be3726327b4229ad1dc7906bcf4d9397ba46be
MD5 bc5e875fcb412fcd0a2df7a24f92306e
BLAKE2b-256 bbee17f1b6e57ecaf00c5022e905875535c0445ac37b1be13f93e590f3ad2a46

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.7-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3c76626c77935be4239feb02f37527a565f01427a62cff7cf7928213e17e5eb5
MD5 ea327b78a72f5a924f90430de9661af8
BLAKE2b-256 b5555298d8604661e4570781062b55cb823e49d2b7f807cfc347a2feb8464e9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.7-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 606bbc399272e6e4bb273c7463fcd019da16fe719f8cfcaa345a741b3065dead
MD5 94c5d8696ff83268194e9a1bc3d53cef
BLAKE2b-256 aaac9f79732373ee7ca669fd89f94fcd0d3163edc6f0b02a409e2bcf1f308952

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