All checks were successful
* Introduce explicit nullability markers in column tags. * Update logic to infer nullability based on Go types when no markers are present. * Ensure correct tags are generated for nullable and non-nullable fields.
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
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
# 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 namecolumn- Column nametype- SQL data typepk- Primary keynotnull- NOT NULL constraintautoincrement- Auto-increment columndefault- Default valueunique- Unique constraintrel- Relationship definition
Example Bun Model
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.BaseModelembedded struct is automatically recognized - Schema defaults to
publicif not specified