NSJ Multi-Database Library

2.1.0 · active · verified Fri Apr 17

The NSJ Multi-Database Library is a Python module designed to enable applications, particularly those built with FastAPI, to efficiently manage and interact with multiple database connections within the same application. It provides an abstraction layer for various database engines (e.g., PostgreSQL, Oracle, SQL Server), simplifying connection pooling, session management, and transactional data access objects (DAOs). The current version is 2.1.0, and the library maintains a steady release cadence for improvements and bug fixes, supporting Python versions 3.6 up to 3.9.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to configure multiple in-memory SQLite databases using `nsj-multi-database-lib`. It shows how to initialize the `ConnectionPool` with a dictionary of database configurations, obtain sessions for different databases using `DatabaseManager.get_session()`, and perform basic SQL operations within a transactional context. Remember to replace the SQLite in-memory setup with your actual database connection strings and credentials.

import os
from nsj_multi_database_lib.connection.connection_pool import ConnectionPool
from nsj_multi_database_lib.connection.database_manager import DatabaseManager
from sqlalchemy import text

# Mock Database setup for example (using SQLite in-memory)
DB_NAME_DEFAULT = "default_db"
DB_NAME_AUDIT = "audit_db"

# NOTE: In a real application, connection_string would use actual DB credentials.
# Example for PostgreSQL: "postgresql://user:password@host:port/database"
DATABASE_CONFIGS = {
    DB_NAME_DEFAULT: {
        "engine": "sqlite",
        "db": ":memory:",
        "connection_string": "sqlite:///:memory:",
        "schema": None,
        "label": DB_NAME_DEFAULT
    },
    DB_NAME_AUDIT: {
        "engine": "sqlite",
        "db": ":memory:",
        "connection_string": "sqlite:///:memory:",
        "schema": None,
        "label": DB_NAME_AUDIT
    }
}

# 1. Initialize the connection pool with your database configurations
ConnectionPool.configure(DATABASE_CONFIGS)

try:
    print("\n--- Using Default Database ---")
    # 2. Get a database session using the context manager
    with DatabaseManager.get_session(DB_NAME_DEFAULT) as session:
        # Example operations with SQLAlchemy 1.x compatible syntax
        session.execute(text("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"))
        session.execute(text("INSERT INTO users (id, name) VALUES (1, 'Alice')"))
        session.execute(text("INSERT INTO users (id, name) VALUES (2, 'Bob')"))
        session.commit()
        result = session.execute(text("SELECT * FROM users")).fetchall()
        print(f"Retrieved from {DB_NAME_DEFAULT}: {result}")

    print("\n--- Using Audit Database ---")
    with DatabaseManager.get_session(DB_NAME_AUDIT) as session:
        session.execute(text("CREATE TABLE logs (id INTEGER PRIMARY KEY, event TEXT)"))
        session.execute(text("INSERT INTO logs (id, event) VALUES (1, 'User Alice created')"))
        session.commit()
        result = session.execute(text("SELECT * FROM logs")).fetchall()
        print(f"Retrieved from {DB_NAME_AUDIT}: {result}")

except Exception as e:
    print(f"An error occurred: {e}")
finally:
    # 3. Always close connections when done to release resources
    ConnectionPool.close_all_connections()
    print("\nAll database connections closed.")

view raw JSON →