Analyze database schema and migrations for onboarding...
Analyze database schemas and migration files to help developers understand the data model quickly. This skill focuses on Go-based migration tools and SQL schema files, identifying table structures, relationships, and dependencies.
Use this skill when you need to:
Common locations for schema and migration files:
project/
├── db/
│ ├── migrations/ # golang-migrate, goose
│ │ ├── 000001_create_users.up.sql
│ │ ├── 000001_create_users.down.sql
│ │ └── ...
│ └── schema.sql # Full schema dump
├── migrations/ # Alternative location
├── schema/ # Schema definitions
├── sql/
│ └── migrations/
└── internal/
└── db/
└── migrations/
File Pattern: {version}_{name}.up.sql / {version}_{name}.down.sql
-- 000001_create_users.up.sql
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 000001_create_users.down.sql
DROP TABLE IF EXISTS users;
Commands:
# List migrations
ls -la migrations/*.sql
# Check migration status
migrate -path ./migrations -database "postgres://..." version
File Pattern: {version}_{name}.sql with annotations
-- +goose Up
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE
);
-- +goose Down
DROP TABLE users;
Commands:
# List migrations
goose -dir ./migrations status
# Show migration files
ls migrations/*.sql
File Pattern: {version}_{name}.sql with annotations
-- +migrate Up
CREATE TABLE users (...);
-- +migrate Down
DROP TABLE users;
File Pattern: schema.hcl or *.sql
table "users" {
schema = schema.public
column "id" {
type = bigserial
}
column "email" {
type = varchar(255)
}
primary_key {
columns = [column.id]
}
}
When analyzing a database schema:
Find Schema Files
# Find migration directories
find . -type d -name "migrations" -o -name "schema" -o -name "db"
# Find SQL files
find . -name "*.sql" -type f
# Find HCL files (Atlas)
find . -name "*.hcl" -type f
Identify Tables
# Find CREATE TABLE statements
grep -r "CREATE TABLE" --include="*.sql"
# List all tables
grep -rh "CREATE TABLE" --include="*.sql" | sed 's/.*CREATE TABLE \(IF NOT EXISTS \)\?//' | cut -d'(' -f1
Map Relationships
# Find foreign keys
grep -r "REFERENCES\|FOREIGN KEY" --include="*.sql"
# Find indexes
grep -r "CREATE INDEX\|CREATE UNIQUE INDEX" --include="*.sql"
Analyze Migration Order
# List migrations in order
ls -1 migrations/*.sql | sort -V
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
title VARCHAR(255)
);
CREATE TABLE user_roles (
user_id BIGINT REFERENCES users(id),
role_id BIGINT REFERENCES roles(id),
PRIMARY KEY (user_id, role_id)
);
CREATE TABLE categories (
id BIGSERIAL PRIMARY KEY,
parent_id BIGINT REFERENCES categories(id),
name VARCHAR(255)
);
Generate a database schema report with:
Schema Overview
Table Catalog
Relationship Map
ER Diagram (Mermaid format)
erDiagram
users ||--o{ posts : "has many"
users ||--o{ user_roles : "has many"
roles ||--o{ user_roles : "has many"
Migration History
| Pattern | Description |
|---|---|
id BIGSERIAL PRIMARY KEY |
Auto-increment primary key |
created_at TIMESTAMP DEFAULT NOW() |
Creation timestamp |
updated_at TIMESTAMP |
Last update timestamp |
deleted_at TIMESTAMP |
Soft delete marker |
*_id BIGINT REFERENCES |
Foreign key reference |
status VARCHAR / status_enum |
State machine field |
metadata JSONB |
Flexible JSON storage |