# {{app_name}} Database Migrator
SeaORM database migration tool for {{app_name}}.
## Setup
Set the `DATABASE_URL` environment variable:
```bash
export DATABASE_URL="postgres://username:password@localhost/{{app_name}}"
```
Or create a `.env` file:
```
DATABASE_URL=postgres://username:password@localhost/{{app_name}}
```
## Usage
### Run all pending migrations
```bash
cargo run -p {{app_name}}-migrator
# or explicitly
cargo run -p {{app_name}}-migrator -- up
```
### Rollback last migration
```bash
cargo run -p {{app_name}}-migrator -- down
```
### Check migration status
```bash
cargo run -p {{app_name}}-migrator -- status
```
### Refresh (rollback all and reapply)
```bash
cargo run -p {{app_name}}-migrator -- refresh
```
### Reset (rollback all)
```bash
cargo run -p {{app_name}}-migrator -- reset
```
## Migrations
Current migrations:
1. **m20240101_000001_create_users_table** - Creates `users` table with:
- `id` (primary key, auto-increment)
- `email` (unique, indexed)
- `password_hash`
- `created_at`
2. **m20240101_000002_create_sessions_table** - Creates `sessions` table with:
- `id` (primary key, auto-increment)
- `token` (unique, indexed)
- `user_id` (foreign key to users, indexed)
- `expires_at` (indexed)
- `created_at`
## Adding New Migrations
1. Create a new migration file in `src/migrations/`:
```rust
// src/migrations/m20240115_create_posts_table.rs
use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.create_table(
Table::create()
.table(Posts::Table)
.if_not_exists()
.col(ColumnDef::new(Posts::Id).integer().not_null().auto_increment().primary_key())
.col(ColumnDef::new(Posts::Title).string().not_null())
.to_owned(),
)
.await
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_table(Table::drop().table(Posts::Table).to_owned())
.await
}
}
#[derive(DeriveIden)]
enum Posts {
Table,
Id,
Title,
}
```
2. Add it to `src/migrations/mod.rs`:
```rust
pub mod m20240115_create_posts_table;
```
3. Register it in `src/lib.rs`:
```rust
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
vec![
Box::new(migrations::m20240115_create_posts_table::Migration),
]
}
```
## Generating Entities
After running migrations, generate SeaORM entities for your gateway app:
```bash
cd ../{{app_name}}
sea-orm-cli generate entity \
-u $DATABASE_URL \
-o src/adapters/entities \
--with-serde both
```
This will generate entity files matching your database schema.
## SeaORM CLI
Install globally for easier migration management:
```bash
cargo install sea-orm-cli
```
Then use:
```bash
sea-orm-cli migrate up
sea-orm-cli migrate down
sea-orm-cli migrate status
```
## Resources
- [SeaORM Migration Guide](https://www.sea-ql.org/SeaORM/docs/migration/setting-up-migration/)
- [SeaORM Entity Generation](https://www.sea-ql.org/SeaORM/docs/generate-entity/sea-orm-cli/)