Database ORM Connections and Queries
Project description
ddcDatabases
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
- Installation
- Features
- Database Classes
- Database Engines
- Database Utilities
- Development
- License
- Support
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
.envfile fallback - SQLAlchemy Integration: Built on top of SQLAlchemy ORM
- Connection Pooling: Configurable connection pooling for better performance
Default Session Settings
Synchronous Sessions:
autoflush = Trueexpire_on_commit = Trueecho = False
Asynchronous Sessions:
autoflush = Trueexpire_on_commit = Falseecho = 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 driversmssql- 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
class Sqlite(
filepath: Optional[str] = None,
echo: Optional[bool] = None,
autoflush: Optional[bool] = None,
expire_on_commit: Optional[bool] = None,
extra_engine_args: Optional[dict] = None,
)
Example:
import sqlalchemy as sa
from ddcDatabases import DBUtils, Sqlite
from your_models import User # Your SQLAlchemy model
with Sqlite() as session:
db_utils = DBUtils(session)
stmt = sa.select(User).where(User.id == 1)
results = db_utils.fetchall(stmt)
for row in results:
print(row)
MSSQL (SQL Server)
class MSSQL(
host: Optional[str] = None,
port: Optional[int] = None,
user: Optional[str] = None,
password: Optional[str] = None,
database: Optional[str] = None,
schema: Optional[str] = None,
echo: Optional[bool] = None,
pool_size: Optional[int] = None,
max_overflow: Optional[int] = None,
autoflush: Optional[bool] = None,
expire_on_commit: Optional[bool] = None,
extra_engine_args: Optional[dict] = None,
)
Synchronous Example:
import sqlalchemy as sa
from ddcDatabases import DBUtils, MSSQL
from your_models import User
with MSSQL() as session:
stmt = sa.select(User).where(User.id == 1)
db_utils = DBUtils(session)
results = db_utils.fetchall(stmt)
for row in results:
print(row)
Asynchronous Example:
import sqlalchemy as sa
from ddcDatabases import DBUtilsAsync, MSSQL
from your_models import User
async def main():
async with MSSQL() as session:
stmt = sa.select(User).where(User.id == 1)
db_utils = DBUtilsAsync(session)
results = await db_utils.fetchall(stmt)
for row in results:
print(row)
PostgreSQL
class PostgreSQL(
host: Optional[str] = None,
port: Optional[int] = None,
user: Optional[str] = None,
password: Optional[str] = None,
database: Optional[str] = None,
echo: Optional[bool] = None,
autoflush: Optional[bool] = None,
expire_on_commit: Optional[bool] = None,
engine_args: Optional[dict] = None,
)
Synchronous Example:
import sqlalchemy as sa
from ddcDatabases import DBUtils, PostgreSQL
from your_models import User
with PostgreSQL() as session:
stmt = sa.select(User).where(User.id == 1)
db_utils = DBUtils(session)
results = db_utils.fetchall(stmt)
for row in results:
print(row)
Asynchronous Example:
import sqlalchemy as sa
from ddcDatabases import DBUtilsAsync, PostgreSQL
from your_models import User
async def main():
async with PostgreSQL() as session:
stmt = sa.select(User).where(User.id == 1)
db_utils = DBUtilsAsync(session)
results = await db_utils.fetchall(stmt)
for row in results:
print(row)
MySQL
Synchronous Example:
import sqlalchemy as sa
from ddcDatabases import DBUtils, MySQL
with MySQL() as session:
stmt = sa.text("SELECT * FROM users WHERE id = :user_id")
db_utils = DBUtils(session)
results = db_utils.fetchall(stmt, {"user_id": 1})
for row in results:
print(row)
Oracle
class Oracle(
host: Optional[str] = None,
port: Optional[int] = None,
user: Optional[str] = None,
password: Optional[str] = None,
servicename: Optional[str] = None,
echo: Optional[bool] = None,
autoflush: Optional[bool] = None,
expire_on_commit: Optional[bool] = None,
extra_engine_args: Optional[dict] = None,
)
Example with explicit credentials:
import sqlalchemy as sa
from ddcDatabases import DBUtils, Oracle
credentials = {
"host": "127.0.0.1",
"user": "system",
"password": "oracle",
"servicename": "xe",
"echo": False,
}
with Oracle(**credentials) as session:
stmt = sa.text("SELECT * FROM dual")
db_utils = DBUtils(session)
results = db_utils.fetchall(stmt)
for row in results:
print(row)
MongoDB
class MongoDB(
host: Optional[str] = None,
port: Optional[int] = None,
user: Optional[str] = None,
password: Optional[str] = None,
database: Optional[str] = None,
batch_size: Optional[int] = None,
limit: Optional[int] = None,
)
Example with explicit credentials:
from ddcDatabases.mongodb import MongoDB
from bson.objectid import ObjectId
credentials = {
"host": "127.0.0.1",
"user": "admin",
"password": "admin",
"database": "admin",
}
with MongoDB(**credentials) as mongodb:
query = {"_id": ObjectId("6772cf60f27e7e068e9d8985")}
collection = "movies"
with mongodb.cursor(collection, query) as cursor:
for document in cursor:
print(document)
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)
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ddcdatabases-2.0.1.tar.gz.
File metadata
- Download URL: ddcdatabases-2.0.1.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fac4867dc9616dd1431bcdb4a0c0ec8c145c57c69062be5b3a01cd70a1cabdad
|
|
| MD5 |
443e11d053811de149aace0bad65c386
|
|
| BLAKE2b-256 |
3e636b2be5b5fffa68525f672b6a81ec40413835f39f5664c326ea4470098845
|
File details
Details for the file ddcdatabases-2.0.1-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: ddcdatabases-2.0.1-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 15.9 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45b78c68c6463dc91ab20635e8ef627a604601f91edf5067cece7b26f7d15013
|
|
| MD5 |
79bac7c5bed21cef8701b0941f67e3e6
|
|
| BLAKE2b-256 |
5ec6d6470e9fc4f976be983268bcad0173f7413e0fc5e282fab862ed3f0f3033
|
File details
Details for the file ddcdatabases-2.0.1-cp313-cp313-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: ddcdatabases-2.0.1-cp313-cp313-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 15.8 kB
- Tags: CPython 3.13, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4500215976488234860fab4a5c9875926b69d009f52db6038980570365a42a2e
|
|
| MD5 |
b16fd54d7dc5327d6f28495e0ad9d451
|
|
| BLAKE2b-256 |
d01a3e30a41cfe77ec9eda702acc7b59e8ca5a535aeab426536041a41a340727
|
File details
Details for the file ddcdatabases-2.0.1-cp313-cp313-macosx_14_0_arm64.whl.
File metadata
- Download URL: ddcdatabases-2.0.1-cp313-cp313-macosx_14_0_arm64.whl
- Upload date:
- Size: 15.8 kB
- Tags: CPython 3.13, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a5778a2465105e38d1bd9cfb169d3f6f829c0a90001d7b232f9245b90c29588
|
|
| MD5 |
9a822e75fe494cf6d082e5e5bc9d5c7f
|
|
| BLAKE2b-256 |
0b5e320fe8a9e86a0324d33aea1e455d2253df5b3b0e9781acd73f85992f0691
|
File details
Details for the file ddcdatabases-2.0.1-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: ddcdatabases-2.0.1-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 15.9 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb100807015e2b2cf0b54b27a332c17d8c179bab717635983839bf40db41d41c
|
|
| MD5 |
ce05524c77ddfb266c33c4cbfd51abfb
|
|
| BLAKE2b-256 |
0307078a13edff593cd112a5e76c7cdc5530f92d09b1e79a972a06ea45f1c298
|
File details
Details for the file ddcdatabases-2.0.1-cp312-cp312-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: ddcdatabases-2.0.1-cp312-cp312-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 15.8 kB
- Tags: CPython 3.12, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ecdf806eb744eaaa241e202f1a396d7f04db5acc5f230b2694e8f2df8981054
|
|
| MD5 |
6a2afe924ff737426df042a3c0a748fd
|
|
| BLAKE2b-256 |
afdcab1f5a5dbb68e99b552e06d6218159572b39a30cba334d0ea98329d85274
|
File details
Details for the file ddcdatabases-2.0.1-cp312-cp312-macosx_14_0_arm64.whl.
File metadata
- Download URL: ddcdatabases-2.0.1-cp312-cp312-macosx_14_0_arm64.whl
- Upload date:
- Size: 15.8 kB
- Tags: CPython 3.12, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d9dacd57ac8d82c0d8a046d14d5b02777613a0b4759be098dc6177b0c328a5f
|
|
| MD5 |
7914fd52754a25d86cd50375f14d02f1
|
|
| BLAKE2b-256 |
6c7dfeb092b127b6959236fe3eb73163ac484dbf078b52ac0246a9c418ada094
|