# YAML Writer Generates database schema definitions in YAML format. ## Overview The YAML Writer converts RelSpec's internal database model representation into YAML format, providing a human-readable, structured representation of the database schema. ## Features - Generates RelSpec's canonical YAML schema format - Human-readable alternative to JSON - Complete schema representation including: - Databases and schemas - Tables, columns, and data types - Constraints (PK, FK, unique, check) - Indexes - Relationships - Views and sequences - Supports comments - Ideal for manual editing and configuration ## Usage ### Basic Example ```go package main import ( "git.warky.dev/wdevs/relspecgo/pkg/models" "git.warky.dev/wdevs/relspecgo/pkg/writers" "git.warky.dev/wdevs/relspecgo/pkg/writers/yaml" ) func main() { options := &writers.WriterOptions{ OutputPath: "schema.yaml", } writer := yaml.NewWriter(options) err := writer.WriteDatabase(db) if err != nil { panic(err) } } ``` ### CLI Examples ```bash # Export PostgreSQL database to YAML relspec --input pgsql \ --conn "postgres://localhost/mydb" \ --output yaml \ --out-file schema.yaml # Convert GORM models to YAML relspec --input gorm --in-file models.go --output yaml --out-file schema.yaml # Convert JSON to YAML relspec --input json --in-file schema.json --output yaml --out-file schema.yaml ``` ## Generated YAML Example ```yaml name: myapp database_type: postgresql source_format: pgsql schemas: - name: public tables: - name: users schema: public columns: id: name: id table: users schema: public type: bigint not_null: true is_primary_key: true auto_increment: true sequence: 1 username: name: username table: users schema: public type: varchar length: 50 not_null: true sequence: 2 email: name: email table: users schema: public type: varchar length: 100 not_null: true sequence: 3 constraints: pk_users: name: pk_users type: PRIMARY KEY table: users schema: public columns: - id uq_users_username: name: uq_users_username type: UNIQUE table: users schema: public columns: - username indexes: idx_users_email: name: idx_users_email table: users schema: public columns: - email unique: false type: btree - name: posts schema: public columns: id: name: id type: bigint not_null: true is_primary_key: true sequence: 1 user_id: name: user_id type: bigint not_null: true sequence: 2 title: name: title type: varchar length: 200 not_null: true sequence: 3 content: name: content type: text not_null: false sequence: 4 constraints: fk_posts_user_id: name: fk_posts_user_id type: FOREIGN KEY table: posts schema: public columns: - user_id referenced_table: users referenced_schema: public referenced_columns: - id on_delete: CASCADE on_update: NO ACTION indexes: idx_posts_user_id: name: idx_posts_user_id columns: - user_id unique: false type: btree views: [] sequences: [] ``` ## Schema Structure The YAML format mirrors the JSON structure with human-readable syntax: - Database level: `name`, `database_type`, `source_format`, `schemas` - Schema level: `name`, `tables`, `views`, `sequences` - Table level: `name`, `schema`, `columns`, `constraints`, `indexes` - Column level: `name`, `type`, `length`, `not_null`, etc. - Constraint level: `name`, `type`, `columns`, foreign key details - Index level: `name`, `columns`, `unique`, `type` ## Advantages Over JSON - More human-readable - Easier to edit manually - Supports comments - Less verbose (no braces/brackets) - Better for configuration files - Natural indentation ## Use Cases - **Configuration** - Schema as configuration - **Documentation** - Human-readable schema docs - **Version Control** - Easier to read diffs - **Manual Editing** - Easier to modify by hand - **Code Generation** - Template-friendly format ## Notes - Output is properly indented (2 spaces) - Preserves all schema metadata - Can be round-tripped with YAML reader - Compatible with YAML 1.2 - More readable than JSON for large schemas - Ideal for documentation and manual workflows