Relational Databases
Purpose
This skill guides relational database selection and implementation across multiple languages. Choose the optimal database engine, ORM/query builder, and deployment strategy for transactional systems, CRUD applications, and structured data storage.
When to Use This Skill
Trigger this skill when:
- Building user authentication, content management, e-commerce applications
- Implementing CRUD operations (Create, Read, Update, Delete)
- Designing data models with relationships (users → posts, orders → items)
- Migrating schemas safely in production
- Setting up connection pooling for performance
- Evaluating serverless database options (Neon, PlanetScale, Turso)
- Integrating with frontend skills (forms, tables, dashboards, search-filter)
Skip this skill for:
- Time-series data at scale (use time-series databases)
- Real-time analytics (use columnar databases)
- Document-heavy workloads (use document databases)
- Key-value caching (use Redis, Memcached)
Quick Reference: Database Selection
Database Selection Decision Tree
═══════════════════════════════════════════════════════════
PRIMARY CONCERN?
├─ MAXIMUM FLEXIBILITY & EXTENSIONS (JSON, arrays, vector search)
│ └─ PostgreSQL
│ ├─ Serverless → Neon (scale-to-zero, database branching)
│ └─ Traditional → Self-hosted, AWS RDS, Google Cloud SQL
│
├─ EMBEDDED / EDGE DEPLOYMENT (local-first, global latency)
│ └─ SQLite or Turso
│ ├─ Global distribution → Turso (libSQL, edge replicas)
│ └─ Local-only → SQLite (embedded, zero-config)
│
├─ LEGACY SYSTEM / MYSQL REQUIRED
│ └─ MySQL
│ ├─ Serverless → PlanetScale (non-blocking migrations)
│ └─ Traditional → Self-hosted, AWS RDS, Google Cloud SQL
│
└─ RAPID PROTOTYPING
├─ Python → SQLModel (FastAPI) or SQLAlchemy 2.0
├─ TypeScript → Prisma (best DX) or Drizzle (performance)
├─ Rust → SQLx (compile-time checks)
└─ Go → sqlc (type-safe code generation)
Quick Reference: ORM vs Query Builder
ORM vs Query Builder Selection
═══════════════════════════════════════════════════════════
TEAM PRIORITIES?
├─ DEVELOPMENT SPEED / DEVELOPER EXPERIENCE
│ └─ ORM (abstracts SQL, handles relations automatically)
│ ├─ Python → SQLAlchemy 2.0, SQLModel
│ ├─ TypeScript → Prisma (migrations, type generation)
│ ├─ Rust → SeaORM (Active Record + Data Mapper)
│ └─ Go → GORM, Ent
│
├─ PERFORMANCE / QUERY CONTROL
│ └─ Query Builder (SQL-like, zero abstraction overhead)
│ ├─ Python → SQLAlchemy Core, asyncpg
│ ├─ TypeScript → Drizzle, Kysely
│ ├─ Rust → SQLx (compile-time query validation!)
│ └─ Go → sqlc (generates types from SQL)
│
├─ TYPE SAFETY / COMPILE-TIME GUARANTEES
│ ├─ Rust → SQLx (queries checked at build time)
│ ├─ Go → sqlc (generates types from SQL)
│ ├─ TypeScript → Prisma or Drizzle
│ └─ Python → SQLModel (Pydantic integration)
│
└─ COMPLEX QUERIES / JOINS
├─ SQL-first → Query builders or raw SQL
└─ ORM-friendly → SeaORM, SQLAlchemy ORM
Multi-Language Implementation
Python: SQLAlchemy 2.0 + SQLModel
Recommended Libraries:
- SQLAlchemy 2.0 (
/websites/sqlalchemy_en_21) - ORM + Core, 7,090 snippets
- SQLModel - FastAPI integration, Pydantic validation
- asyncpg - High-performance async PostgreSQL driver
When to Use:
- Production applications requiring flexibility
- FastAPI/Starlette backends
- Async/await workflows
Quick Pattern:
from sqlmodel import SQLModel, Field, Session
class User(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
email: str = Field(unique=True, index=True)
See: references/orms-python.md for complete SQLAlchemy/SQLModel patterns, async workflows, and connection pooling.
TypeScript: Prisma vs Drizzle
Recommended Libraries:
- Prisma 6.x (
/prisma/prisma, score: 96.4, 4,281 doc snippets) - Best DX, migrations
- Drizzle ORM (
/drizzle-team/drizzle-orm-docs, score: 95.4, 4,037 snippets) - Performance, SQL-like
Quick Comparison:
- Prisma: Best DX, auto-generated types, migrations included
- Drizzle: Best performance, SQL-like syntax, zero overhead
See: references/orms-typescript.md for Prisma vs Drizzle detailed comparison, Kysely, TypeORM patterns.
Rust: SQLx (Compile-Time Checked)
Recommended Libraries:
- SQLx 0.8 - Compile-time query validation, async
- SeaORM 1.x - Full ORM with Active Record pattern
- Diesel 2.3 - Mature, stable (sync/async)
Quick Pattern:
use sqlx::FromRow;
#[derive(FromRow)]
struct User { id: i32, email: String, name: String }
// Compile-time checked queries (verified at build time!)
let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE email = $1")
.bind("test@example.com").fetch_one(&pool).await?;
See: references/orms-rust.md for SQLx macros, SeaORM, Diesel patterns, and compile-time guarantees.
Go: sqlc (Type-Safe Code Generation)
Recommended Libraries:
- sqlc - Generates Go code from SQL queries
- GORM v2 - Full ORM with associations, hooks
- Ent - Graph-based ORM, schema as code
- pgx - High-performance PostgreSQL driver
Quick Pattern:
-- queries.sql: SQL annotations generate type-safe Go code
-- name: CreateUser :one
INSERT INTO users (email, name) VALUES ($1, $2) RETURNING *;
user, err := queries.CreateUser(ctx, db.CreateUserParams{Email: "test@example.com"})
See: references/orms-go.md for sqlc setup, GORM, Ent, and pgx patterns.
Connection Pooling
Recommended Pool Sizes:
- Web API (single instance): 10-20 connections
- Serverless (per function): 1-2 connections + pgBouncer
- Background workers: 5-10 connections
See: references/connection-pooling.md for configuration examples, sizing formulas, and monitoring strategies.
Migrations
Critical Principles:
- Use multi-phase deployment for column drops (never drop directly in production)
- Use
CREATE INDEX CONCURRENTLY (PostgreSQL) to avoid blocking writes
- Test migrations in staging with production-like data volume
Tools: Alembic (Python), Prisma Migrate (TypeScript), SQLx migrations (Rust), golang-migrate (Go)
See: references/migrations-guide.md for safe migration patterns, multi-phase deployments, and rollback strategies.
Serverless Databases
| Database |
Type |
Key Feature |
Best For |
| Neon |
PostgreSQL |
Database branching, scale-to-zero |
Development workflows, preview environments |
| PlanetScale |
MySQL (Vitess) |
Non-blocking schema changes |
MySQL apps, zero-downtime migrations |
| Turso |
SQLite (libSQL) |
Edge deployment, low latency |
Edge functions, global distribution |
See: references/serverless-databases.md for setup examples, branching workflows, and cost comparisons.
Frontend Integration
Common Integration Patterns:
- Forms skill: Form submission → API validation → Database CRUD (INSERT/UPDATE)
- Tables skill: Paginated queries → API → Table display with sorting/filtering
- Dashboards skill: Aggregation queries (COUNT, SUM) → API → KPI cards
- Search-filter skill: Full-text search (PostgreSQL tsvector) → Ranked results
See working examples in: examples/python-sqlalchemy/, examples/typescript-drizzle/, examples/rust-sqlx/
Bundled Resources
Reference Documentation
references/postgresql-guide.md - PostgreSQL features (pgvector, PostGIS, TimescaleDB)
references/mysql-guide.md - MySQL-specific patterns, PlanetScale integration
references/sqlite-guide.md - SQLite patterns, Turso edge deployment
references/orms-python.md - SQLAlchemy 2.0, SQLModel, asyncpg
references/orms-typescript.md - Prisma, Drizzle, Kysely comparisons
references/orms-rust.md - SQLx, SeaORM, Diesel
references/orms-go.md - GORM, sqlc, Ent, pgx
references/migrations-guide.md - Safe schema evolution patterns
references/connection-pooling.md - Pool sizing and monitoring
references/serverless-databases.md - Neon, PlanetScale, Turso deployment
Working Examples
examples/python-sqlalchemy/ - SQLAlchemy 2.0 + FastAPI with pooling, migrations
examples/typescript-prisma/ - Prisma + Next.js with schema, migrations
examples/typescript-drizzle/ - Drizzle + Hono with type-safe queries
examples/rust-sqlx/ - SQLx + Axum with compile-time checks
examples/go-sqlc/ - sqlc + Gin with generated type-safe code
Utility Scripts
scripts/validate_schema.py - Validate database schema structure, constraints
scripts/generate_migration.py - Generate migration templates for common operations
Best Practices
Security:
- Always use parameterized queries (prevents SQL injection)
- Hash passwords with Argon2/bcrypt
- Use environment variables for connection strings
- Enable SSL/TLS in production
Performance:
- Use connection pooling (10-20 for web APIs)
- Create indexes on filtered/sorted columns
- Implement pagination for large result sets
- Use
EXPLAIN ANALYZE for slow queries
Reliability:
- Test migrations in staging first
- Use transactions for multi-statement operations
- Monitor connection pool exhaustion
- Set up and test database backups
Development:
- Version control schema and migrations
- Use database branching (Neon) for features
- Write integration tests against real databases
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: using-relational-databases3description: Relational database implementation across Python, Rust, Go, and TypeScript. Use when building CRUD applications, transactional systems, or structured data storage. Covers PostgreSQL (primary), MySQL, SQLite, ORMs (SQLAlchemy, Prisma, SeaORM, GORM), query builders (Drizzle, sqlc, SQLx), migrations, connection pooling, and serverless databases (Neon, PlanetScale, Turso). Use when this capability is needed.4---56# Relational Databases78## Purpose910This skill guides relational database selection and implementation across multiple languages. Choose the optimal database engine, ORM/query builder, and deployment strategy for transactional systems, CRUD applications, and structured data storage.1112## When to Use This Skill1314**Trigger this skill when:**15- Building user authentication, content management, e-commerce applications16- Implementing CRUD operations (Create, Read, Update, Delete)17- Designing data models with relationships (users → posts, orders → items)18- Migrating schemas safely in production19- Setting up connection pooling for performance20- Evaluating serverless database options (Neon, PlanetScale, Turso)21- Integrating with frontend skills (forms, tables, dashboards, search-filter)2223**Skip this skill for:**24- Time-series data at scale (use time-series databases)25- Real-time analytics (use columnar databases)26- Document-heavy workloads (use document databases)27- Key-value caching (use Redis, Memcached)2829## Quick Reference: Database Selection3031```32Database Selection Decision Tree33═══════════════════════════════════════════════════════════3435PRIMARY CONCERN?36├─ MAXIMUM FLEXIBILITY & EXTENSIONS (JSON, arrays, vector search)37│ └─ PostgreSQL38│ ├─ Serverless → Neon (scale-to-zero, database branching)39│ └─ Traditional → Self-hosted, AWS RDS, Google Cloud SQL40│41├─ EMBEDDED / EDGE DEPLOYMENT (local-first, global latency)42│ └─ SQLite or Turso43│ ├─ Global distribution → Turso (libSQL, edge replicas)44│ └─ Local-only → SQLite (embedded, zero-config)45│46├─ LEGACY SYSTEM / MYSQL REQUIRED47│ └─ MySQL48│ ├─ Serverless → PlanetScale (non-blocking migrations)49│ └─ Traditional → Self-hosted, AWS RDS, Google Cloud SQL50│51└─ RAPID PROTOTYPING52 ├─ Python → SQLModel (FastAPI) or SQLAlchemy 2.053 ├─ TypeScript → Prisma (best DX) or Drizzle (performance)54 ├─ Rust → SQLx (compile-time checks)55 └─ Go → sqlc (type-safe code generation)56```5758## Quick Reference: ORM vs Query Builder5960```61ORM vs Query Builder Selection62═══════════════════════════════════════════════════════════6364TEAM PRIORITIES?65├─ DEVELOPMENT SPEED / DEVELOPER EXPERIENCE66│ └─ ORM (abstracts SQL, handles relations automatically)67│ ├─ Python → SQLAlchemy 2.0, SQLModel68│ ├─ TypeScript → Prisma (migrations, type generation)69│ ├─ Rust → SeaORM (Active Record + Data Mapper)70│ └─ Go → GORM, Ent71│72├─ PERFORMANCE / QUERY CONTROL73│ └─ Query Builder (SQL-like, zero abstraction overhead)74│ ├─ Python → SQLAlchemy Core, asyncpg75│ ├─ TypeScript → Drizzle, Kysely76│ ├─ Rust → SQLx (compile-time query validation!)77│ └─ Go → sqlc (generates types from SQL)78│79├─ TYPE SAFETY / COMPILE-TIME GUARANTEES80│ ├─ Rust → SQLx (queries checked at build time)81│ ├─ Go → sqlc (generates types from SQL)82│ ├─ TypeScript → Prisma or Drizzle83│ └─ Python → SQLModel (Pydantic integration)84│85└─ COMPLEX QUERIES / JOINS86 ├─ SQL-first → Query builders or raw SQL87 └─ ORM-friendly → SeaORM, SQLAlchemy ORM88```8990## Multi-Language Implementation9192### Python: SQLAlchemy 2.0 + SQLModel9394**Recommended Libraries:**95- **SQLAlchemy 2.0** (`/websites/sqlalchemy_en_21`) - ORM + Core, 7,090 snippets96- **SQLModel** - FastAPI integration, Pydantic validation97- **asyncpg** - High-performance async PostgreSQL driver9899**When to Use:**100- Production applications requiring flexibility101- FastAPI/Starlette backends102- Async/await workflows103104**Quick Pattern:**105```python106from sqlmodel import SQLModel, Field, Session107class User(SQLModel, table=True):108 id: int | None = Field(default=None, primary_key=True)109 email: str = Field(unique=True, index=True)110```111112**See:** `references/orms-python.md` for complete SQLAlchemy/SQLModel patterns, async workflows, and connection pooling.113114### TypeScript: Prisma vs Drizzle115116**Recommended Libraries:**117- **Prisma 6.x** (`/prisma/prisma`, score: 96.4, 4,281 doc snippets) - Best DX, migrations118- **Drizzle ORM** (`/drizzle-team/drizzle-orm-docs`, score: 95.4, 4,037 snippets) - Performance, SQL-like119120**Quick Comparison:**121- **Prisma**: Best DX, auto-generated types, migrations included122- **Drizzle**: Best performance, SQL-like syntax, zero overhead123124**See:** `references/orms-typescript.md` for Prisma vs Drizzle detailed comparison, Kysely, TypeORM patterns.125126### Rust: SQLx (Compile-Time Checked)127128**Recommended Libraries:**129- **SQLx 0.8** - Compile-time query validation, async130- **SeaORM 1.x** - Full ORM with Active Record pattern131- **Diesel 2.3** - Mature, stable (sync/async)132133**Quick Pattern:**134```rust135use sqlx::FromRow;136#[derive(FromRow)]137struct User { id: i32, email: String, name: String }138// Compile-time checked queries (verified at build time!)139let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE email = $1")140 .bind("test@example.com").fetch_one(&pool).await?;141```142143**See:** `references/orms-rust.md` for SQLx macros, SeaORM, Diesel patterns, and compile-time guarantees.144145### Go: sqlc (Type-Safe Code Generation)146147**Recommended Libraries:**148- **sqlc** - Generates Go code from SQL queries149- **GORM v2** - Full ORM with associations, hooks150- **Ent** - Graph-based ORM, schema as code151- **pgx** - High-performance PostgreSQL driver152153**Quick Pattern:**154```sql155-- queries.sql: SQL annotations generate type-safe Go code156-- name: CreateUser :one157INSERT INTO users (email, name) VALUES ($1, $2) RETURNING *;158```159```go160user, err := queries.CreateUser(ctx, db.CreateUserParams{Email: "test@example.com"})161```162163**See:** `references/orms-go.md` for sqlc setup, GORM, Ent, and pgx patterns.164165## Connection Pooling166167**Recommended Pool Sizes:**168- Web API (single instance): 10-20 connections169- Serverless (per function): 1-2 connections + pgBouncer170- Background workers: 5-10 connections171172**See:** `references/connection-pooling.md` for configuration examples, sizing formulas, and monitoring strategies.173174## Migrations175176**Critical Principles:**1771. Use multi-phase deployment for column drops (never drop directly in production)1782. Use `CREATE INDEX CONCURRENTLY` (PostgreSQL) to avoid blocking writes1793. Test migrations in staging with production-like data volume180181**Tools:** Alembic (Python), Prisma Migrate (TypeScript), SQLx migrations (Rust), golang-migrate (Go)182183**See:** `references/migrations-guide.md` for safe migration patterns, multi-phase deployments, and rollback strategies.184185## Serverless Databases186187| Database | Type | Key Feature | Best For |188|----------|------|-------------|----------|189| **Neon** | PostgreSQL | Database branching, scale-to-zero | Development workflows, preview environments |190| **PlanetScale** | MySQL (Vitess) | Non-blocking schema changes | MySQL apps, zero-downtime migrations |191| **Turso** | SQLite (libSQL) | Edge deployment, low latency | Edge functions, global distribution |192193**See:** `references/serverless-databases.md` for setup examples, branching workflows, and cost comparisons.194195## Frontend Integration196197**Common Integration Patterns:**198- **Forms skill**: Form submission → API validation → Database CRUD (INSERT/UPDATE)199- **Tables skill**: Paginated queries → API → Table display with sorting/filtering200- **Dashboards skill**: Aggregation queries (COUNT, SUM) → API → KPI cards201- **Search-filter skill**: Full-text search (PostgreSQL tsvector) → Ranked results202203**See working examples in:** `examples/python-sqlalchemy/`, `examples/typescript-drizzle/`, `examples/rust-sqlx/`204205## Bundled Resources206207### Reference Documentation208- `references/postgresql-guide.md` - PostgreSQL features (pgvector, PostGIS, TimescaleDB)209- `references/mysql-guide.md` - MySQL-specific patterns, PlanetScale integration210- `references/sqlite-guide.md` - SQLite patterns, Turso edge deployment211- `references/orms-python.md` - SQLAlchemy 2.0, SQLModel, asyncpg212- `references/orms-typescript.md` - Prisma, Drizzle, Kysely comparisons213- `references/orms-rust.md` - SQLx, SeaORM, Diesel214- `references/orms-go.md` - GORM, sqlc, Ent, pgx215- `references/migrations-guide.md` - Safe schema evolution patterns216- `references/connection-pooling.md` - Pool sizing and monitoring217- `references/serverless-databases.md` - Neon, PlanetScale, Turso deployment218219### Working Examples220- `examples/python-sqlalchemy/` - SQLAlchemy 2.0 + FastAPI with pooling, migrations221- `examples/typescript-prisma/` - Prisma + Next.js with schema, migrations222- `examples/typescript-drizzle/` - Drizzle + Hono with type-safe queries223- `examples/rust-sqlx/` - SQLx + Axum with compile-time checks224- `examples/go-sqlc/` - sqlc + Gin with generated type-safe code225226### Utility Scripts227- `scripts/validate_schema.py` - Validate database schema structure, constraints228- `scripts/generate_migration.py` - Generate migration templates for common operations229230## Best Practices231232**Security:**233- Always use parameterized queries (prevents SQL injection)234- Hash passwords with Argon2/bcrypt235- Use environment variables for connection strings236- Enable SSL/TLS in production237238**Performance:**239- Use connection pooling (10-20 for web APIs)240- Create indexes on filtered/sorted columns241- Implement pagination for large result sets242- Use `EXPLAIN ANALYZE` for slow queries243244**Reliability:**245- Test migrations in staging first246- Use transactions for multi-statement operations247- Monitor connection pool exhaustion248- Set up and test database backups249250**Development:**251- Version control schema and migrations252- Use database branching (Neon) for features253- Write integration tests against real databases254255---256> Converted and distributed by [TomeVault](https://tomevault.io/claim/ancoleman) — claim your Tome and manage your conversions.257<!-- tomevault:4.0:skill_md:2026-04-11 -->