153 lines
3.6 KiB
Markdown
153 lines
3.6 KiB
Markdown
# JSON Reader
|
|
|
|
Reads database schema definitions from JSON files.
|
|
|
|
## Overview
|
|
|
|
The JSON Reader parses JSON files that define database schemas in RelSpec's canonical JSON format and converts them into RelSpec's internal database model representation.
|
|
|
|
## Features
|
|
|
|
- Reads RelSpec's standard JSON schema format
|
|
- Supports complete schema representation including:
|
|
- Databases and schemas
|
|
- Tables, columns, and data types
|
|
- Constraints (PK, FK, unique, check)
|
|
- Indexes
|
|
- Relationships
|
|
- Views and sequences
|
|
|
|
## Usage
|
|
|
|
### Basic Example
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"git.warky.dev/wdevs/relspecgo/pkg/readers"
|
|
"git.warky.dev/wdevs/relspecgo/pkg/readers/json"
|
|
)
|
|
|
|
func main() {
|
|
options := &readers.ReaderOptions{
|
|
FilePath: "/path/to/schema.json",
|
|
}
|
|
|
|
reader := json.NewReader(options)
|
|
db, err := reader.ReadDatabase()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
fmt.Printf("Found %d schemas\n", len(db.Schemas))
|
|
}
|
|
```
|
|
|
|
### CLI Example
|
|
|
|
```bash
|
|
# Read JSON schema and convert to GORM models
|
|
relspec --input json --in-file schema.json --output gorm --out-file models.go
|
|
|
|
# Convert JSON to PostgreSQL DDL
|
|
relspec --input json --in-file database.json --output pgsql --out-file schema.sql
|
|
|
|
# Transform JSON to YAML
|
|
relspec --input json --in-file schema.json --output yaml --out-file schema.yaml
|
|
```
|
|
|
|
## Example JSON Schema
|
|
|
|
```json
|
|
{
|
|
"name": "myapp",
|
|
"database_type": "postgresql",
|
|
"schemas": [
|
|
{
|
|
"name": "public",
|
|
"tables": [
|
|
{
|
|
"name": "users",
|
|
"schema": "public",
|
|
"columns": {
|
|
"id": {
|
|
"name": "id",
|
|
"type": "bigint",
|
|
"not_null": true,
|
|
"is_primary_key": true,
|
|
"auto_increment": true,
|
|
"sequence": 1
|
|
},
|
|
"username": {
|
|
"name": "username",
|
|
"type": "varchar",
|
|
"length": 50,
|
|
"not_null": true,
|
|
"sequence": 2
|
|
},
|
|
"email": {
|
|
"name": "email",
|
|
"type": "varchar",
|
|
"length": 100,
|
|
"not_null": true,
|
|
"sequence": 3
|
|
}
|
|
},
|
|
"constraints": {
|
|
"pk_users": {
|
|
"name": "pk_users",
|
|
"type": "PRIMARY KEY",
|
|
"columns": ["id"]
|
|
},
|
|
"uq_users_username": {
|
|
"name": "uq_users_username",
|
|
"type": "UNIQUE",
|
|
"columns": ["username"]
|
|
}
|
|
},
|
|
"indexes": {
|
|
"idx_users_email": {
|
|
"name": "idx_users_email",
|
|
"columns": ["email"],
|
|
"unique": false,
|
|
"type": "btree"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Schema Structure
|
|
|
|
The JSON format follows RelSpec's internal model structure:
|
|
|
|
- `Database` - Top-level container
|
|
- `name` - Database name
|
|
- `database_type` - Database system (postgresql, mysql, etc.)
|
|
- `schemas[]` - Array of schemas
|
|
|
|
- `Schema` - Schema/namespace
|
|
- `name` - Schema name
|
|
- `tables[]` - Array of tables
|
|
- `views[]` - Array of views
|
|
- `sequences[]` - Array of sequences
|
|
|
|
- `Table` - Table definition
|
|
- `name` - Table name
|
|
- `columns{}` - Map of columns
|
|
- `constraints{}` - Map of constraints
|
|
- `indexes{}` - Map of indexes
|
|
- `relationships{}` - Map of relationships
|
|
|
|
## Notes
|
|
|
|
- This is RelSpec's native interchange format
|
|
- Preserves complete schema information
|
|
- Ideal for version control and schema documentation
|
|
- Can be used as an intermediate format for transformations
|