# DrawDB Writer Generates DrawDB-compatible JSON files from database schema information. ## Overview The DrawDB Writer converts RelSpec's internal database model representation into JSON format compatible with DrawDB, a free online database design tool. ## Features - Generates DrawDB JSON format - Creates table and field definitions - Defines relationships - Includes visual layout information - Preserves constraints and indexes ## 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/drawdb" ) func main() { options := &writers.WriterOptions{ OutputPath: "diagram.json", } writer := drawdb.NewWriter(options) err := writer.WriteDatabase(db) if err != nil { panic(err) } } ``` ### CLI Examples ```bash # Generate DrawDB diagram from PostgreSQL database relspec --input pgsql \ --conn "postgres://localhost/mydb" \ --output drawdb \ --out-file diagram.json # Convert GORM models to DrawDB for visualization relspec --input gorm --in-file models.go --output drawdb --out-file design.json # Convert JSON schema to DrawDB relspec --input json --in-file schema.json --output drawdb --out-file diagram.json ``` ## Generated JSON Example ```json { "version": "1.0", "database": "PostgreSQL", "tables": [ { "id": "1", "name": "users", "x": 100, "y": 100, "fields": [ { "id": "1", "name": "id", "type": "BIGINT", "primary": true, "autoIncrement": true, "notNull": true }, { "id": "2", "name": "username", "type": "VARCHAR", "size": 50, "notNull": true, "unique": true }, { "id": "3", "name": "email", "type": "VARCHAR", "size": 100, "notNull": true } ], "indexes": [ { "name": "idx_users_email", "fields": ["email"] } ] }, { "id": "2", "name": "posts", "x": 400, "y": 100, "fields": [ { "id": "1", "name": "id", "type": "BIGINT", "primary": true }, { "id": "2", "name": "user_id", "type": "BIGINT", "notNull": true }, { "id": "3", "name": "title", "type": "VARCHAR", "size": 200, "notNull": true } ] } ], "relationships": [ { "id": "1", "source": "2", "target": "1", "sourceField": "user_id", "targetField": "id", "type": "many-to-one", "onDelete": "CASCADE" } ] } ``` ## DrawDB Features ### Table Properties - `id` - Unique table identifier - `name` - Table name - `x`, `y` - Position in diagram - `fields` - Array of field definitions - `indexes` - Array of index definitions ### Field Properties - `id` - Unique field identifier - `name` - Field name - `type` - Data type (BIGINT, VARCHAR, etc.) - `size` - Length for string types - `primary` - Primary key flag - `notNull` - NOT NULL constraint - `unique` - Unique constraint - `autoIncrement` - Auto-increment flag - `default` - Default value ### Relationship Properties - `id` - Unique relationship identifier - `source` - Source table ID - `target` - Target table ID - `sourceField` - Foreign key field - `targetField` - Referenced field - `type` - Relationship type (one-to-one, one-to-many, many-to-one) - `onDelete` - Delete action - `onUpdate` - Update action ## Notes - DrawDB is available at drawdb.vercel.app - Generated files can be imported for visual editing - Visual positions (x, y) are auto-generated - Ideal for creating ERD diagrams - Supports modern database features - Free and open-source tool