Database
Set up PostgreSQL with Drizzle ORM in LaunchSaaS. Connect to Neon, Supabase, or self-hosted databases with type-safe queries and migrations.
Database
LaunchSaaS uses PostgreSQL with Drizzle ORM for type-safe database operations. This guide covers database configuration and setup.
Setup
Create a Database
Recommended to use hosted PostgreSQL database services. They provide easy setup and management, and often include free tiers sufficient for getting started.
Neon (Recommended)
Neon is a serverless PostgreSQL service with an excellent developer experience.
Setup Steps:
- Create an account at neon.tech
- Create a new project
- Create a database
- Get your connection string from the dashboard
- Add the connection string to your
.envfile:
DATABASE_URL="postgres://user:[email protected]/database?sslmode=require"Supabase
Supabase provides PostgreSQL databases with additional features like authentication and storage.
Setup Steps:
- Create an account at supabase.com
- Create a new project
- Click on the
Connectbutton - Get your connection string in
Transaction poolersection - Add the connection string to your
.envfile:
DATABASE_URL="postgres://postgres:[email protected]:6543/postgres"Initialize the Database
After configuring your database URL, initialize the database:
pnpm run initThis command will:
- Generate the Drizzle migrations
- Apply migrations to your database
- Create the admin user
If you are setting up the environment, now you can go back to the Environment Setup guide and continue.
Other Database Options
Self-Hosted
Docker
Run PostgreSQL in a Docker container for local development:
docker run --name launchsaas-postgres -e POSTGRES_PASSWORD=mypassword -d -p 5432:5432 postgresConnection string:
DATABASE_URL="postgres://postgres:mypassword@localhost:5432/postgres"Local Installation
Install PostgreSQL directly on your machine from postgres.org.
Other Hosted Services
Database Commands
| Command | Description |
|---|---|
pnpm run db:generate | Generate migrations from schema changes |
pnpm run db:migrate | Apply migrations to database |
pnpm run db:push | Push schema changes directly (dev only, skips migrations) |
pnpm run db:generate:auth | Regenerate Better Auth schema (after auth config changes) |
pnpm run init:db | Generate + migrate (combined) |
Running Commands for Different Environments
By default, database commands use your .env file. To run commands against a different environment (e.g., production or staging), use dotenv to load the appropriate environment file:
# Push schema to production database
pnpm dotenv -e .env.production -- pnpm db:push
# Run migrations on staging database
pnpm dotenv -e .env.staging -- pnpm db:migrate
# Generate migrations using production database
pnpm dotenv -e .env.production -- pnpm db:generateBe careful when running database commands against production. Always backup
your data before running migrations, and prefer db:migrate over db:push in
production environments.
Schema Organization
Database schemas are located in src/schemas/tables/:
| File | Description |
|---|---|
auth.ts | Authentication tables (auto-generated by Better Auth) |
order.ts | Order table for confirmed monetary transactions |
entitlement.ts | Entitlement table for user access to products |
index.ts | Re-exports all schemas |
Don't manually edit auth.ts - it's auto-generated. Run npm run db:generate:auth after changing auth configuration.
Order Table
Represents confirmed monetary transactions:
- Created when payment is confirmed
- One-time products create an order upon checkout completion
- Subscription products create an order upon each successful payment (recurring orders)
- Contains: provider info, product details, amount, currency, metadata
Entitlement Table
Represents user access to products:
- Granted/extended when order is paid
- One-time products create entitlement with status "active" upon checkout
- Subscription products create entitlement with status "pending", becomes "active" after first payment
- Contains: subscription period info, cancellation status, provider subscription IDs
- Supports multiple payment providers (Stripe, Creem, etc.)
FAQ
Connection Issues
If you're having trouble connecting to your database:
- Check that your
DATABASE_URLis correctly formatted - Ensure your IP is allowed in the database's firewall settings
- Verify that the database user has the correct permissions
- Check for any network restrictions
Migration Issues
If you're experiencing issues with database migrations:
- Check your schema definitions for errors
- Ensure your migration scripts are correctly formatted
- Try running migrations manually to see detailed errors
References
- Neon Documentation
- Supabase Documentation
- Drizzle ORM Documentation
- Drizzle with Neon
- Drizzle with Supabase