- mssql: write computed columns (AS (expr) PERSISTED) and identity; read computed definition and identity - sqlite: write GENERATED ALWAYS AS (expr) STORED; read generated columns via table_xinfo and parse the expression - drizzle: generatedAlwaysAs / generated(Always|ByDefault)AsIdentity, read and write - typeorm: asExpression/generatedType and identity decorators, read and write; decorator scan is now quote-aware - bun, gorm readers: read generated and identity markers - readmes updated
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 constraintgenerated- Generated column marker (Generated; expression is not in the tag)identity- Identity column marker (Identity,ALWAYS)rel- 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