# DBML Reader Reads Database Markup Language (DBML) files and extracts database schema information. ## Overview The DBML Reader parses `.dbml` files that define database schemas using the DBML syntax (used by dbdiagram.io) and converts them into RelSpec's internal database model representation. ## Features - Parses DBML syntax - Extracts tables, columns, and relationships - Supports DBML-specific features: - Table groups and notes - Enum definitions - Indexes - Foreign key relationships ## Usage ### Basic Example ```go package main import ( "fmt" "git.warky.dev/wdevs/relspecgo/pkg/readers" "git.warky.dev/wdevs/relspecgo/pkg/readers/dbml" ) func main() { options := &readers.ReaderOptions{ FilePath: "/path/to/schema.dbml", } reader := dbml.NewReader(options) db, err := reader.ReadDatabase() if err != nil { panic(err) } fmt.Printf("Found %d schemas\n", len(db.Schemas)) } ``` ### CLI Example ```bash # Read DBML file and convert to JSON relspec --input dbml --in-file schema.dbml --output json --out-file schema.json # Convert DBML to GORM models relspec --input dbml --in-file database.dbml --output gorm --out-file models.go ``` ## Example DBML File ```dbml Table users { id bigserial [pk, increment] username varchar(50) [not null, unique] email varchar(100) [not null] created_at timestamp [not null, default: `now()`] Note: 'Users table' } Table posts { id bigserial [pk] user_id bigint [not null, ref: > users.id] title varchar(200) [not null] content text indexes { user_id (user_id, created_at) [name: 'idx_user_posts'] } } Ref: posts.user_id > users.id [delete: cascade] ``` ## DBML Features Supported - Table definitions with columns - Primary keys (`pk`) - Not null constraints (`not null`) - Unique constraints (`unique`) - Default values (`default`) - Inline references (`ref`) - Standalone `Ref` blocks - Indexes and composite indexes - Table notes and column notes - Enums ## Notes - DBML is designed for database documentation and diagramming - Schema name defaults to `public` - Relationship cardinality is preserved