YesDB
A lightweight relational database built from scratch in Python with SQL support, B-tree storage, and a cloud Backend-as-a-Service for students.
Installation
# Local only
pip install yesdb
# With cloud support
pip install yesdb[cloud]
Quick Start
Local Mode
from yesdb import connect
db = connect("myapp.db")
db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
db.execute("INSERT INTO users VALUES (NULL, 'Alice', 30)")
results = db.execute("SELECT * FROM users")
for row in results:
print(row)
db.close()
Cloud Mode
YesDB Cloud lets you host your database on a remote server. Perfect for student projects that need a real backend.
1. Sign up and create a database
yesdb signup
# Email: student@uni.edu
# Password: ********
# -> Account created! Logged in.
yesdb init myproject
# -> Created yesdb/ folder with schema.py
# -> Database "myproject" created on cloud.
2. Define your schema
After running yesdb init, you'll have a yesdb/schema.py file in your project. Edit it:
# yesdb/schema.py
from yesdb import Table, Column, Integer, Text, Real
users = Table("users", [
Column("id", Integer, primary_key=True),
Column("name", Text),
Column("email", Text),
])
products = Table("products", [
Column("id", Integer, primary_key=True),
Column("name", Text),
Column("price", Real),
])
3. Push your schema to the cloud
yesdb push
# -> Connecting to myproject database...
# -> Table "users" created
# -> Table "products" created
# -> Schema synced. 2 tables pushed.
4. Use in your code
from yesdb import connect
db = connect("myproject") # uses saved credentials automatically
db.execute("INSERT INTO users VALUES (NULL, 'Alice', 'alice@uni.edu')")
db.execute("INSERT INTO users VALUES (NULL, 'Bob', 'bob@uni.edu')")
rows = db.execute("SELECT * FROM users")
for row in rows:
print(row)
Every response includes the database engine's internal logs (B-tree operations, SQL parsing, page allocations), so you can see exactly what's happening under the hood.
5. Use with FastAPI or Flask
# main.py
from fastapi import FastAPI
from yesdb import connect
app = FastAPI()
db = connect("myproject")
@app.get("/users")
def get_users():
rows = db.execute("SELECT * FROM users")
return {"users": [list(row) for row in rows]}
@app.post("/users")
def create_user(name: str, email: str):
db.execute(f"INSERT INTO users VALUES (NULL, '{name}', '{email}')")
return {"status": "created"}
CLI Commands
yesdb signup # Create an account
yesdb login # Login to existing account
yesdb init <db_name> # Initialize a project with a cloud database
yesdb push # Push schema.py to the cloud
yesdb databases # List your databases
yesdb shell <db_name> # Interactive SQL shell against a cloud database
Local CLI Shell
yesdb-local mydatabase.db
YesDB> CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
YesDB> INSERT INTO users VALUES (NULL, 'Alice', 30);
YesDB> SELECT * FROM users;
.help Show help
.tables List all tables
.schema Show table schemas
.exit Exit shell
Features
- SQL Support: CREATE, SELECT, INSERT, UPDATE, DELETE, DROP, ALTER TABLE
- Data Types: INTEGER, TEXT, REAL, BLOB
- Query Features: WHERE, ORDER BY, LIMIT, OFFSET, DISTINCT
- B-Tree Storage: Efficient indexing and data retrieval
- No Dependencies: Pure Python implementation (local mode)
- Cloud BaaS: Host your database remotely with a single command
- Schema DSL: Define tables in Python, push to cloud
- Engine Logs: See B-tree splits, page allocations, and SQL parsing in every response
- Interactive Shell: Built-in SQL shell (local and cloud)
- Auto-increment: PRIMARY KEY auto-increment support
SQL Examples
-- Create table
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT, age INTEGER)
-- Insert data
INSERT INTO users VALUES (NULL, 'Alice', 'alice@example.com', 30)
INSERT INTO users VALUES (NULL, 'Bob', 'bob@example.com', 25)
-- Query with conditions
SELECT * FROM users WHERE age > 25
SELECT name, email FROM users WHERE name = 'Alice'
-- Order and limit
SELECT * FROM users ORDER BY age DESC
SELECT * FROM users LIMIT 10 OFFSET 5
-- Update and delete
UPDATE users SET age = 31 WHERE name = 'Alice'
DELETE FROM users WHERE age < 18
-- Alter table
ALTER TABLE users ADD COLUMN country TEXT
-- Drop table
DROP TABLE users
How Cloud Mode Works
Your machine YesDB Cloud Server
──────────────── ──────────────────
yesdb CLI (signup/login/push) ┌─────────────────┐
<-> HTTPS │ nginx (SSL) │
yesdb SDK (connect/execute) │ └─ FastAPI │
│ ├─ auth │
│ └─ data/ │
│ ├─ user1/ │
│ │ └─ *.db │
│ └─ user2/ │
│ └─ *.db │
└─────────────────┘
- Each user gets their own isolated account with multiple databases
- All traffic is encrypted over HTTPS
- Authentication via API key (generated at signup, saved locally)
- Database engine logs are returned with every query for full transparency
Security
Local Mode
- Path validation (blocks system file access)
- Resource limits (SQL length, record size)
- Input validation (table/column names)
Cloud Mode
- HTTPS encryption (TLS via Let's Encrypt)
- API key authentication (SHA-256 hashed, never stored in plaintext)
- Password hashing (bcrypt)
- Per-user data isolation
- Request size limits
Development
Install from Source
git clone https://github.com/AzharAhmed-bot/yesdb.git
cd yes_db
pip install -e ".[cloud]"
Run Tests
pip install pytest
pytest
Requirements
- Python 3.8+
- No external dependencies (local mode)
requests(cloud mode, installed withpip install yesdb[cloud])
License
MIT License - see LICENSE file
Links
- PyPI: https://pypi.org/project/yesdb/
- GitHub: https://github.com/AzharAhmed-bot/yesdb
- Issues: https://github.com/AzharAhmed-bot/yesdb/issues
Version
Current version: 0.2.0 (Beta)
Changelog
v0.2.0 (Beta)
- New:
GROUP BYwith aggregate functions —COUNT,COUNT(*),SUM,AVG,MIN,MAX, combinable withWHERE,ORDER BY, andLIMIT/OFFSET. - Fix: Cloud server connection pool had a race condition — concurrent requests could open duplicate connections to the same database, or run unsynchronized queries against it, risking corruption. Access per database is now serialized.
- New: Query execution timeout on the cloud server (default 10s, configurable via
YESDB_QUERY_TIMEOUT_SECONDS) so a slow query can't block every other user of that database indefinitely. - Status: Moved from Alpha to Beta. Local Mode is beta-ready; Cloud Mode is feature-complete and tested but not currently deployed (see Cloud Mode section).
v0.1.5 (bug fixes)
- Fix:
from yesdb import connectnow works correctly. Ayesdbcompatibility package is included so the import matches the PyPI package name. - Fix:
Table.to_sql()now emits thePRIMARY KEYconstraint in the generatedCREATE TABLESQL, so auto-increment works as expected when insertingNULLinto a primary key column.
Note: YesDB is an educational database built from scratch to teach database internals. For production systems, consider SQLite, PostgreSQL, or MySQL.
Metadata
Release files for yesdb 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| yesdb-0.2.0.tar.gz | 84.4 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yesdb-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 139.5 kB
Release files / yesdb-0.2.0.tar.gz
| Download URL | yesdb-0.2.0.tar.gz |
|---|---|
| Size | 84.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3606402b1b38af5c4af51b205f70f5572aad8119603888c0bf23f67a04bc2c6d
|
|
BLAKE2b-256 checksum How to use checksums |
083c2c612c7695cf971d0dd177021a5346b16015671f9057694b363965947c6e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Release files / yesdb-0.2.0-py3-none-any.whl
| Download URL | yesdb-0.2.0-py3-none-any.whl |
|---|---|
| Size | 55.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9189a70a9b14e6c164cc862cad8f3e64bf92c26fe02c2fc08f366481e3804ab1
|
|
BLAKE2b-256 checksum How to use checksums |
4bf50e7310c6ee625a58a92fb7aad2edd03bc58bd69fe27420c4e31a693a09d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Security for yesdb 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.