model-usage

griffnb's avatarfrom griffnb

Working with model instances and fields

⭐0stars🔀0forks📁View on GitHub🕐Updated Jan 2, 2026

When & Why to Use This Skill

This Claude skill provides a comprehensive framework for managing Go database models with a focus on thread-safety and type integrity. It enables developers to implement standardized Get/Set patterns, handle complex JSONB structures, and manage various database field types like UUIDs and Decimals, ensuring robust and maintainable backend architecture.

Use Cases

  • Case 1: Generating thread-safe boilerplate code for new database model instances to prevent race conditions in concurrent Go applications.
  • Case 2: Implementing type-safe field accessors (Getters/Setters) to ensure data consistency across complex backend services.
  • Case 3: Mapping and manipulating JSONB database columns to Go structs with built-in error handling and validation.
  • Case 4: Standardizing model field operations using typed constructors and constant-based field types for better code readability and IDE support.
namemodel-usage
descriptionWorking with model instances and fields

Using Models

Models provide thread-safe field access through typed methods. All operations use .Set() and .Get() patterns.

Creating Model Instances

Basic Constructor

// Create new model instance
user := user.New()

Typed Constructor

For specific types (like joined models):

// Create a new model instance for a specific type
joinedUser := user.NewType[*user.JoinedUser]()

Setting Field Values

All fields use .Set(value) method:

user.Name.Set("Alice")
user.Email.Set("alice@example.com")
user.Age.Set(30)
user.Status.Set(constants.StatusActive)

Getting Field Values

All fields use .Get() method:

name := user.Name.Get()      // "Alice"
email := user.Email.Get()    // "alice@example.com"
age := user.Age.Get()        // 30
status := user.Status.Get()  // constants.StatusActive

Working with Struct Fields

Struct fields (JSONB columns) have additional methods:

Setting Struct Values

type Bookmarks struct {
    FavoriteID types.UUID `json:"favorite_id"`
    RecentIDs  []types.UUID `json:"recent_ids"`
}

user.Bookmarks.Set(&Bookmarks{
    FavoriteID: uuid1,
    RecentIDs:  []types.UUID{uuid2, uuid3},
})

Getting Struct Values

// .Get() returns value and error
bookmarks, err := user.Bookmarks.Get()
if err != nil {
    return err
}

// .GetI() ignores errors (use when error checking not needed)
bookmarks := user.Bookmarks.GetI()

Field Types Reference

Field Type Go Type Database Type Use Case
StringField string text Text/string columns
UUIDField types.UUID uuid UUID columns
IntField int integer/smallint Integer/boolean (0/1) columns
DecimalField decimal.Decimal numeric Decimal/numeric columns
IntConstantField[T] T (int-based) smallint Enum/constant fields
StructField[T] T jsonb JSONB/struct columns

Thread Safety

All field operations are thread-safe by default. Models use internal mutexes to protect concurrent access.

// Safe to use from multiple goroutines
go user.Name.Set("Alice")
go user.Email.Set("alice@example.com")

Common Patterns

Updating Multiple Fields

user := user.New()
user.Name.Set("Alice")
user.Email.Set("alice@example.com")
user.Age.Set(30)
user.Status.Set(constants.StatusActive)

err := user.Save(ctx)
if err != nil {
    return err
}

Reading and Modifying

user, err := user.GetByID(ctx, userID)
if err != nil {
    return err
}

// Modify fields
currentAge := user.Age.Get()
user.Age.Set(currentAge + 1)

err = user.Save(ctx)
if err != nil {
    return err
}

Working with Optional Fields

Fields with null:"true" can be set to nil:

// Set to nil
user.MiddleName.SetNull()

// Check if nil
user.MiddleName.IsNull()

File Organization Standards

  • queries.go - All specific queries
  • functions.go - All model functions (not methods)
  • Methods - Use pointer receivers with this as the receiver variable