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.8.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.8-cp313-cp313-win_amd64.whl (22.3 kB view details)

Uploaded CPython 3.13Windows x86-64

ddcdatabases-2.0.8-cp313-cp313-manylinux_2_39_x86_64.whl (22.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

ddcdatabases-2.0.8-cp313-cp313-macosx_15_0_arm64.whl (22.1 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

ddcdatabases-2.0.8-cp313-cp313-macosx_14_0_arm64.whl (22.1 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

ddcdatabases-2.0.8-cp312-cp312-win_amd64.whl (22.3 kB view details)

Uploaded CPython 3.12Windows x86-64

ddcdatabases-2.0.8-cp312-cp312-manylinux_2_39_x86_64.whl (22.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

ddcdatabases-2.0.8-cp312-cp312-macosx_15_0_arm64.whl (22.1 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

ddcdatabases-2.0.8-cp312-cp312-macosx_14_0_arm64.whl (22.1 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for ddcdatabases-2.0.8.tar.gz
Algorithm Hash digest
SHA256 04b1d1856179255b39a98c2ab6360f8c60c02754e3f22a49eeb8d8b19b19c059
MD5 4979fc1cbfd892dc8e68ef4af5e69d8e
BLAKE2b-256 d2b856838f589400c9f708d3555c4f2af26871dc4c6d00ea65eb842f55cca333

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 065cf31e0dc6d2e80874f6783b8581b443f8870eae32e46828fa181bd0e4889a
MD5 be199211fb7199f25bf5e509bb3c5b0a
BLAKE2b-256 cf97be2593bd3d6679899cc0b9e80f84adcf24b9ac30759a33ef9919aa749d80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.8-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 512a88d56df444fd49e7351122a30692c910f007a3717ce1ed67456e9cf6f21d
MD5 82a94bf6fa6c92337681ce3d3fd7f747
BLAKE2b-256 8acf0e0b7102ab24db390a083abc52c7951157804bd990caf692ec648e3325cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.8-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 b5f41ca66a519345aeef6b60b3db892cee13d55206089697b782daae7048718d
MD5 961b2f7495dd2e5e590c02c64e81544b
BLAKE2b-256 651ac6af0b7e5e10afa7cd60a41a41822527a322099063e5daed6dbec47457b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.8-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a0ff2788879aad517032a3bf557986287c8cfeeb3ee80ef4385d392a25123e07
MD5 3688e9b5d96c2048bf8fe8a31dbe0fb8
BLAKE2b-256 d6aa21d1050361566f7a752bd7562cc3f51c855f5d5810f01a36f1331b2427c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 bfd5057507967fc68ee594fd6c390eebc53e55b97e4f3c3407c8d1e5ddab1ebb
MD5 5da42c2ff81f5e9509abe47459b13b01
BLAKE2b-256 20315f9071472742bd6ba5d08754fc9b65c99951497c25dcf92ecdbb52518183

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.8-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 36c63acaf7ae7967cc8535476dad9af3fcdca3af397bb77bb93988a07221e2a2
MD5 b7237ced854f9d25bf3b8dd724c33b99
BLAKE2b-256 fdd71ce0c0bd3e1680c04916df7affca0b7bf0f00c15d9647e6d5343cd3363aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.8-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 fef5a45ddf9bb767a75b52557f17a5e2ccabc076e99bf85c80663fe0a02b86cf
MD5 cbc4c601d8c8c8e43a05c43ae896618c
BLAKE2b-256 c01ea0750d956b2e8a01319efeff35ed6641275faa9399a39acfed148aba22fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ddcdatabases-2.0.8-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 2545fac0b938bcd077ea0d0189b8022aad56accf03c7549af05a2e5a1eda71c3
MD5 f19b7377a6bc0bea482d3043d3ba5d27
BLAKE2b-256 e350bacf6b8fbd3cf90e227a38491b4d023d1d77d9d2be4c69ebe51d5d049add

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