Files
Hein f6c3f2b460
All checks were successful
CI / Test (1.24) (push) Successful in -27m40s
CI / Test (1.25) (push) Successful in -27m32s
CI / Lint (push) Successful in -27m46s
CI / Build (push) Successful in -27m56s
Integration Tests / Integration Tests (push) Successful in -27m40s
feat(bun): 🎉 Enhance nullability handling in column parsing
* 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.
2026-01-04 22:11:44 +02:00
..
2025-12-19 22:28:24 +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