Files
Hein b55737ab4c
Some checks failed
CI / Test (1.24) (push) Successful in -25m42s
CI / Test (1.25) (push) Successful in -25m40s
CI / Build (push) Successful in -25m54s
CI / Lint (push) Successful in -25m27s
Integration Tests / Integration Tests (push) Failing after -25m48s
Fixed linting issues
2025-12-28 14:51:19 +02:00
..
2025-12-19 22:28:24 +02:00
2025-12-28 14:51:19 +02:00
2025-12-28 10:34:20 +02:00

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 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

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