107 lines
2.4 KiB
Markdown
107 lines
2.4 KiB
Markdown
# Bun Reader
|
|
|
|
Reads Go source files containing Bun model definitions and extracts database schema information.
|
|
|
|
## Overview
|
|
|
|
The Bun Reader parses Go source code files that define Bun models (structs with `bun` struct tags) and converts them into RelSpec's internal database model representation.
|
|
|
|
## Features
|
|
|
|
- Parses Bun struct tags to extract column definitions
|
|
- Extracts table names from `bun:"table:tablename"` tags
|
|
- Identifies primary keys, foreign keys, and indexes
|
|
- Supports relationship detection
|
|
- Handles both single files and directories
|
|
|
|
## Usage
|
|
|
|
### Basic Example
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"git.warky.dev/wdevs/relspecgo/pkg/readers"
|
|
"git.warky.dev/wdevs/relspecgo/pkg/readers/bun"
|
|
)
|
|
|
|
func main() {
|
|
options := &readers.ReaderOptions{
|
|
FilePath: "/path/to/models.go",
|
|
}
|
|
|
|
reader := bun.NewReader(options)
|
|
db, err := reader.ReadDatabase()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
fmt.Printf("Found %d schemas\n", len(db.Schemas))
|
|
}
|
|
```
|
|
|
|
### CLI Example
|
|
|
|
```bash
|
|
# Read Bun models and convert to JSON
|
|
relspec --input bun --in-file models/ --output json --out-file schema.json
|
|
|
|
# Convert Bun models to GORM
|
|
relspec --input bun --in-file models.go --output gorm --out-file gorm_models.go
|
|
```
|
|
|
|
## Supported Bun Tags
|
|
|
|
The reader recognizes the following Bun struct tags:
|
|
|
|
- `table` - Table name
|
|
- `column` - Column name
|
|
- `type` - SQL data type
|
|
- `pk` - Primary key
|
|
- `notnull` - NOT NULL constraint
|
|
- `autoincrement` - Auto-increment column
|
|
- `default` - Default value
|
|
- `unique` - Unique constraint
|
|
- `rel` - Relationship definition
|
|
|
|
## Example Bun Model
|
|
|
|
```go
|
|
package models
|
|
|
|
import (
|
|
"time"
|
|
"github.com/uptrace/bun"
|
|
)
|
|
|
|
type User struct {
|
|
bun.BaseModel `bun:"table:users,alias:u"`
|
|
|
|
ID int64 `bun:"id,pk,autoincrement"`
|
|
Username string `bun:"username,notnull,unique"`
|
|
Email string `bun:"email,notnull"`
|
|
CreatedAt time.Time `bun:"created_at,notnull,default:now()"`
|
|
|
|
Posts []*Post `bun:"rel:has-many,join:id=user_id"`
|
|
}
|
|
|
|
type Post struct {
|
|
bun.BaseModel `bun:"table:posts,alias:p"`
|
|
|
|
ID int64 `bun:"id,pk"`
|
|
UserID int64 `bun:"user_id,notnull"`
|
|
Title string `bun:"title,notnull"`
|
|
Content string `bun:"content"`
|
|
|
|
User *User `bun:"rel:belongs-to,join:user_id=id"`
|
|
}
|
|
```
|
|
|
|
## Notes
|
|
|
|
- Test files (ending in `_test.go`) are automatically excluded
|
|
- The `bun.BaseModel` embedded struct is automatically recognized
|
|
- Schema defaults to `public` if not specified
|