Files
relspecgo/pkg/readers/bun/README.md
Hein 666eab7cec
Some checks failed
CI / Test (1.24) (push) Failing after -24m41s
CI / Test (1.25) (push) Failing after -24m25s
CI / Lint (push) Failing after -25m49s
CI / Build (push) Successful in -26m3s
Updated Readme files
2025-12-28 10:34:20 +02:00

2.4 KiB

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