dbhandler
A lightweight Python package for managing SQLite, PostgreSQL, and MySQL databases — with a fluent query builder and an ORM-style model layer.
Installation
pip install .
pip install ".[postgresql]"
pip install ".[mysql]"
pip install ".[all]"
pip install ".[dev]"
Quick Start
DBHandler — direct SQL
from dbhandler import DBHandler
with DBHandler("sqlite", database=":memory:") as db:
db.execute("""
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
age INTEGER DEFAULT 0
)
""")
db.insert("users", {"name": "Alice", "email": "alice@example.com", "age": 30})
db.insert_many("users", [
{"name": "Bob", "email": "bob@example.com", "age": 25},
{"name": "Carol", "email": "carol@example.com", "age": 35},
])
adults = db.select("users", where="age >= ?", params=(30,), order_by="name ASC")
for user in adults:
print(user["name"], user["age"])
db.update("users", {"age": 31}, where="name = ?", where_params=("Alice",))
db.delete("users", where="name = ?", params=("Bob",))
row = db.fetchone("SELECT * FROM users WHERE email = ?", ("alice@example.com",))
print(row)
PostgreSQL / MySQL
db = DBHandler(
"postgresql",
host="localhost",
port=5432,
database="mydb",
user="admin",
password="secret",
)
db.connect()
db.disconnect()
QueryBuilder — fluent SQL construction
from dbhandler import DBHandler, QueryBuilder
with DBHandler("sqlite", database="app.db") as db:
sql, params = (
QueryBuilder("users")
.select("id", "name", "email")
.where("age > ?", 18)
.order_by("name ASC")
.limit(10)
.build()
)
rows = db.fetchall(sql, params)
sql, params = QueryBuilder("users").insert(name="Dave", email="d@d.com", age=22).build()
db.execute(sql, params)
sql, params = (
QueryBuilder("users")
.update(email="dave@new.com")
.where("name = ?", "Dave")
.build()
)
db.execute(sql, params)
sql, params = QueryBuilder("users").delete().where("id = ?", 99).build()
db.execute(sql, params)
db.commit()
BaseModel — ORM-style interface
from dbhandler import DBHandler, BaseModel
from dbhandler.models import Field
class User(BaseModel):
__table__ = "users"
id = Field(int, primary_key=True)
name = Field(str, nullable=False)
email = Field(str, nullable=False, unique=True)
age = Field(int, default=0)
db = DBHandler("sqlite", database="app.db")
db.connect()
User.__db__ = db
User.create_table()
alice = User(name="Alice", email="alice@example.com", age=30)
alice.save()
all_users = User.all()
alice = User.get(id=1)
adults = User.filter("age >= ?", (18,))
total = User.count()
alice.age = 31
alice.save()
alice.delete()
db.disconnect()
Transactions
with DBHandler("sqlite", database="app.db") as db:
with db.transaction():
db.insert("orders", {"user_id": 1, "total": 99.99})
db.insert("order_items", {"order_id": 1, "product_id": 42, "qty": 2})
Schema Utilities
db.table_exists("users")
db.get_tables()
db.get_columns("users")
Running Tests
pip install ".[dev]"
pytest tests/ -v --cov=dbhandler
License
MIT