Skip to content

subhashdasyam/SimplerDB

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SimplerDB

A simple, unified interface for multiple database systems in Python 3.8+.

Developed by: Subhash Dasyam, March 2025

Features

  • Single API for multiple databases: Work with different databases using a consistent interface
  • Supported databases:
    • MySQL, MariaDB, Percona
    • SQLite
    • PostgreSQL (with pgvector support)
    • Microsoft SQL Server
    • Oracle
    • Redis
    • ChromaDB
  • Security-focused: Protection against SQL injection including table/column name sanitization
  • Connection management: Pooling, automatic reconnection, and retry mechanisms
  • Transaction support: Context managers for easy transaction handling
  • Vector database support: Built-in vector operations for PostgreSQL with pgvector
  • Type hints: Full type annotation support for better IDE integration
  • Python 3.8+ compatibility

Installation

Basic Installation

pip install pip install git+https://github.com/subhashdasyam/simplerdb.git

With Specific Database Support

# MySQL/MariaDB support
pip install "git+https://github.com/subhashdasyam/simplerdb.git#egg=simplerdb[mysql]"

# PostgreSQL support
pip install "git+https://github.com/subhashdasyam/simplerdb.git#egg=simplerdb[postgres]"

# PostgreSQL with vector support
pip install "git+https://github.com/subhashdasyam/simplerdb.git#egg=simplerdb[pgvector]"

# Microsoft SQL Server support
pip install "git+https://github.com/subhashdasyam/simplerdb.git#egg=simplerdb[mssql]"

# Oracle support
pip install "git+https://github.com/subhashdasyam/simplerdb.git#egg=simplerdb[oracle]"

# Redis support
pip install "git+https://github.com/subhashdasyam/simplerdb.git#egg=simplerdb[redis]"

# ChromaDB support
pip install "git+https://github.com/subhashdasyam/simplerdb.git#egg=simplerdb[chromadb]"

# All databases
pip install "git+https://github.com/subhashdasyam/simplerdb.git#egg=simplerdb[all]"

Quick Start

Creating Database Connections

from simplerdb import connect

# MySQL connection
mysql_db = connect("mysql", 
                   host="localhost", 
                   db="mydatabase", 
                   user="username", 
                   passwd="password")

# SQLite connection
sqlite_db = connect("sqlite", 
                    database="/path/to/database.db")

# PostgreSQL connection
postgres_db = connect("postgres", 
                      host="localhost", 
                      dbname="mydatabase", 
                      user="username", 
                      password="password")

# Redis connection
redis_db = connect("redis", 
                   host="localhost", 
                   port=6379, 
                   db=0, 
                   decode_responses=True)

Basic CRUD Operations

# Insert a record
db.insert("users", {
    "username": "john_doe",
    "email": "john@example.com",
    "age": 30
})

# Get a single record
user = db.get_one("users", ["username", "email"], {"username": "john_doe"})
print(f"User: {user['username']}, Email: {user['email']}")

# Get multiple records
active_users = db.get_all(
    "users", 
    ["id", "username", "email"], 
    ("status = %s", ["active"]), 
    ["created_at", "DESC"], 
    [0, 10]  # LIMIT 0, 10
)

# Update records
db.update(
    "users",
    {"status": "inactive", "updated_at": "2025-03-19"},
    {"username": "john_doe"}
)

# Delete records
db.delete("users", {"username": "john_doe"})

Using Transactions

# Using context manager for transactions
with db.transaction():
    db.insert("orders", {"user_id": 42, "total": 99.99})
    order_id = db.last_insert_id()
    db.insert("order_items", {"order_id": order_id, "product_id": 101, "quantity": 2})
    # Automatically commits on success, rolls back on exception

Vector Operations with pgvector

from simplerdb import connect

# Connect to PostgreSQL with pgvector extension
db = connect("pgvector", 
             host="localhost", 
             dbname="vectordb", 
             user="username", 
             password="password")

# Create a table with a vector column
db.create_vector_table(
    "documents",
    "embedding",
    dimensions=384,
    extra_columns={
        "title": "VARCHAR(255) NOT NULL",
        "content": "TEXT",
        "metadata": "JSONB"
    }
)

# Insert a record with a vector
db.insert("documents", {
    "title": "Sample Document",
    "content": "This is a sample document for vector search",
    "embedding": [0.1, 0.2, 0.3, ...],  # 384-dimensional vector
    "metadata": {"source": "example", "tags": ["sample", "demo"]}
})

# Perform a similarity search
query_vector = [0.15, 0.25, 0.35, ...]  # Your query vector
results = db.similarity_search(
    "documents",
    "embedding",
    query_vector,
    limit=5,
    where={"metadata->>'source'": "example"},
    similarity_measure="cosine"
)

# Process results
for doc in results:
    print(f"Document: {doc['title']}, Similarity: {doc['similarity_score']}")

Working with Redis

from simplerdb import connect

# Connect to Redis
db = connect("redis", 
             host="localhost", 
             port=6379, 
             db=0, 
             decode_responses=True)

# Set a simple key-value
db.set("user:1001", json.dumps({
    "username": "john_doe",
    "email": "john@example.com",
    "age": 30
}))

# Get a value
user_data = json.loads(db.get("user:1001"))

# Hash operations
db.hset("user:1002", "username", "jane_doe")
db.hset("user:1002", "email", "jane@example.com")
db.hset("user:1002", "age", 28)

# Get all hash fields
user = db.hgetall("user:1002")

# Using SimplerDB-style interface
db.insert("user:1003", {
    "username": "alice",
    "email": "alice@example.com",
    "age": 35
})

# Get multiple users by pattern
users = db.get_all("user:*")

Database-Specific Features

Each database connector provides specialized methods and features beyond the common interface.

MySQL/MariaDB Specific

# Batch update with optimized SQL
db.update_batch("products", [
    {"id": 1, "price": 19.99, "stock": 100},
    {"id": 2, "price": 29.99, "stock": 50},
    {"id": 3, "price": 39.99, "stock": 75}
], "id")

# Insert or update (UPSERT)
db.insert_or_update("products", 
                    {"id": 4, "name": "New Product", "price": 49.99}, 
                    "id")

PostgreSQL Specific

# Execute a stored procedure
db.execute_procedure("update_inventory", [101, 10])

# Execute a function and get result
total = db.execute_function("calculate_order_total", [1001])

# JSON operations
db.execute("UPDATE users SET preferences = preferences || %s::jsonb WHERE id = %s",
           [json.dumps({"theme": "dark"}), 42])

SQLite Specific

# Execute a SQL script
db.executescript("""
    BEGIN TRANSACTION;
    CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);
    INSERT INTO users (name) VALUES ('Alice');
    INSERT INTO users (name) VALUES ('Bob');
    COMMIT;
""")

# Use pragmas
db.execute("PRAGMA journal_mode = WAL")
db.execute("PRAGMA synchronous = NORMAL")

Redis Specific

# List operations
db.lpush("recent_users", "user:1001", "user:1002")
recent_users = db.lrange("recent_users", 0, -1)

# Set operations
db.sadd("active_users", "user:1001", "user:1003")
active_users = db.smembers("active_users")

# Sorted set operations
db.zadd("user_scores", {"user:1001": 95, "user:1002": 88, "user:1003": 92})
top_users = db.zrange("user_scores", 0, 2, withscores=True)

Advanced Usage

Connection Pooling

# MySQL with connection pooling
db = connect("mysql", 
             host="localhost", 
             db="mydatabase", 
             user="username", 
             passwd="password",
             pool_size=10)

# PostgreSQL with connection pooling
db = connect("postgres", 
             host="localhost", 
             dbname="mydatabase", 
             user="username", 
             password="password",
             pool_min_size=3,
             pool_max_size=20)

Query Retry Mechanism

from simplerdb import connect

db = connect("mysql", 
             host="localhost", 
             db="mydatabase", 
             user="username", 
             passwd="password")

# Execute with retry for transient failures
try:
    result = db.execute(
        "SELECT * FROM large_table WHERE complex_condition = %s", 
        ["value"], 
        max_retries=3, 
        retry_delay=1.0  # seconds
    )
except Exception as e:
    print(f"Query failed after retries: {e}")

Using Multiple Databases

from simplerdb import connect

# Connect to different databases
mysql_db = connect("mysql", 
                   host="localhost", 
                   db="app_data", 
                   user="username", 
                   passwd="password")

redis_db = connect("redis", 
                   host="localhost", 
                   port=6379, 
                   db=0, 
                   decode_responses=True)

vector_db = connect("pgvector", 
                    host="localhost", 
                    dbname="embeddings", 
                    user="username", 
                    password="password")

# Use each database for its strengths
user = mysql_db.get_one("users", ["id", "username", "email"], {"id": 42})

redis_db.set(f"user:{user['id']}:last_login", datetime.now().isoformat())
redis_db.sadd("active_users", str(user['id']))

document_embeddings = vector_db.similarity_search(
    "documents", 
    "embedding", 
    query_vector,
    where={"user_id": user['id']},
    limit=5
)

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the GNU GPLv2 License.

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages