Skip to main content
ShipFree uses PostgreSQL as its database with Drizzle ORM for type-safe queries and schema management. This combination provides excellent developer experience with full TypeScript support.

Why Drizzle ORM?

Drizzle was chosen for ShipFree because it offers:

Type Safety

Full TypeScript inference with autocomplete

SQL-like API

Familiar SQL syntax for developers

Performance

Zero runtime overhead, compiles to raw SQL

Migrations

Automatic migration generation from schema changes

Database Connection

The database connection is configured in src/database/index.ts:
src/database/index.ts
The database client uses connection pooling automatically for better performance in serverless environments.

Database Schema

The complete schema is defined in src/database/schema.ts:
src/database/schema.ts

Schema Features

Auto-updating Timestamps

src/database/schema.ts
The $onUpdate modifier automatically updates the updatedAt field whenever a record is modified.

Database Indexes

Indexes improve query performance for frequently accessed fields:
src/database/schema.ts

Foreign Key Constraints

src/database/schema.ts
onDelete: 'cascade' means deleting a user will automatically delete all related records (sessions, accounts, etc.).

Querying Data

Basic Queries

Relations & Joins

Inserting Data

Updating Data

Deleting Data

Transactions

Use transactions to ensure data consistency:
If any operation in the transaction fails, all changes are rolled back automatically.

Migrations

1

Generate Migration

After modifying src/database/schema.ts, generate a migration:
This creates a new migration file in the migrations/ directory.
2

Review Migration

Review the generated SQL in migrations/ to ensure it’s correct.
3

Run Migration

Apply the migration to your database:

Migration Configuration

drizzle.config.ts

Type Safety

Drizzle provides full TypeScript inference:

Database Utilities

Query Builder

Aggregations

Best Practices

Use Indexes

Add indexes to frequently queried fields for better performance

Batch Operations

Use bulk inserts/updates instead of multiple individual queries

Use Transactions

Wrap related operations in transactions to maintain consistency

Type Everything

Leverage TypeScript inference to catch errors at compile time

Environment Variables

.env
For local development, you can use Docker to run PostgreSQL:

Further Reading

Drizzle Docs

Official Drizzle ORM documentation

Query Examples

Learn about advanced queries

Migrations Guide

Master database migrations

PostgreSQL Docs

PostgreSQL official documentation