UPDATE API Examples¶
This document shows examples of using the improved UPDATE API with pointer parameters instead of variadic options.
All examples use the github.com/oddbit-project/blueprint/db/sqlbuilder
package.
Basic UPDATE Operations¶
Simple UPDATE with default options¶
import "github.com/oddbit-project/blueprint/db/sqlbuilder"
builder := sqlbuilder.NewSqlBuilder(sqlbuilder.DefaultSqlDialect())
user := User{
Name: "John Doe",
Email: "john@example.com",
Age: 30,
IsActive: true,
}
whereConditions := []WhereCondition{
{Field: "id", Operator: "=", Value: 1},
}
// Use nil for default options
sql, args, err := builder.BuildSQLUpdate("users", user, whereConditions, nil)
UPDATE with custom options¶
options := &UpdateOptions{
IncludeFields: []string{"Name", "Email"},
IncludeZeroValues: true,
}
sql, args, err := builder.BuildSQLUpdate("users", user, whereConditions, options)
UPDATE by ID with default options¶
// Use nil for default options
sql, args, err := builder.BuildSQLUpdateByID("users", user, 123, nil)
UPDATE by ID with custom options¶
options := &UpdateOptions{
ExcludeFields: []string{"CreatedAt", "UpdatedAt"},
}
sql, args, err := builder.BuildSQLUpdateByID("users", user, 123, options)
Batch UPDATE Operations¶
Batch UPDATE with default options¶
users := []any{
User{ID: 1, Name: "User 1", Email: "user1@example.com"},
User{ID: 2, Name: "User 2", Email: "user2@example.com"},
User{ID: 3, Name: "User 3", Email: "user3@example.com"},
}
// Use nil for default options
statements, argsList, err := builder.BuildSQLBatchUpdate("users", users, []string{"ID"}, nil)
Batch UPDATE with custom options¶
options := &UpdateOptions{
IncludeFields: []string{"Name", "Email"},
IncludeZeroValues: true,
}
statements, argsList, err := builder.BuildSQLBatchUpdate("users", users, []string{"ID"}, options)
Advanced Examples¶
UPDATE with field exclusion¶
options := &UpdateOptions{
ExcludeFields: []string{"CreatedAt", "UpdatedAt", "ID"},
}
sql, args, err := builder.BuildSQLUpdate("users", user, whereConditions, options)
UPDATE with zero value inclusion¶
options := &UpdateOptions{
IncludeZeroValues: true,
}
sql, args, err := builder.BuildSQLUpdate("users", user, whereConditions, options)
UPDATE with auto field updates¶
options := &UpdateOptions{
UpdateAutoFields: true,
IncludeFields: []string{"Name", "Email", "UpdatedAt"},
}
sql, args, err := builder.BuildSQLUpdate("users", user, whereConditions, options)
Benefits of Pointer Parameters¶
- Clearer Intent:
nil
clearly indicates default options - No Ambiguity: No confusion about multiple options
- Memory Efficient: Options are passed by reference
- Go Idiomatic: Follows Go conventions for optional parameters
- Type Safety: Compile-time checking of parameter types
Migration from Variadic Parameters¶
Before (Variadic)¶
// Multiple ways to call, confusing
builder.BuildSQLUpdate("users", user, whereConditions) // no options
builder.BuildSQLUpdate("users", user, whereConditions, options) // with options
builder.BuildSQLUpdate("users", user, whereConditions, DefaultUpdateOptions()) // explicit default
After (Pointer)¶
// Clear, consistent API
builder.BuildSQLUpdate("users", user, whereConditions, nil) // default options
builder.BuildSQLUpdate("users", user, whereConditions, &options) // custom options