| name | goframe-v2 |
| description | GoFrame development skill. TRIGGER when writing/modifying Go files, implementing services, creating APIs, or database operations. DO NOT TRIGGER for frontend/shell scripts. |
| license | Apache-2.0 |
Critical Conventions
Project Development Standards
- For complete projects (HTTP/microservices), install GoFrame CLI and use
gf init to create project scaffolding. See Project Creation - init for details.
- Auto-generated code files (dao, do, entity) MUST NOT be manually created or modified per GoFrame conventions.
- Unless explicitly requested, do NOT use the
logic/ directory for business logic. Implement business logic directly in the service/ directory.
- Reference complete project examples:
Component Usage Standards
- Before creating new methods or variables, check if they already exist elsewhere and reuse existing implementations.
- Use the
gerror component for all error handling to ensure complete stack traces for traceability.
- When exploring new components, prioritize GoFrame built-in components and reference best practice code from examples.
- Database Operations MUST use DO objects (
internal/model/do/), never g.Map or map[string]interface{}. DO struct fields are interface{}; unset fields remain nil and are automatically ignored by the ORM:
dao.Users.Ctx(ctx).Where(cols.Id, id).Data(do.User{Uid: uid}).Update()
data := do.User{}
if password != "" { data.PasswordHash = hash }
if isAdmin != nil { data.IsAdmin = *isAdmin }
dao.Users.Ctx(ctx).Where(cols.Id, id).Data(data).Update()
dao.Instances.Ctx(ctx).Where(cols.Id, id).Data(do.Instance{IdleSince: gdb.Raw("NULL")}).Update()
dao.Users.Ctx(ctx).Data(g.Map{cols.Uid: uid}).Update()
Code Style Standards
Soft Delete & Time Maintenance
GoFrame provides automatic soft delete and time maintenance features. When a table contains created_at, updated_at, or deleted_at fields, the ORM handles these automatically.
Automatic Time Fields
| Field | Auto Behavior |
|---|
created_at | Auto-written on Insert/InsertAndGetId, never modified afterward |
updated_at | Auto-written on Insert/Update/Save |
deleted_at | Auto-written on Delete (soft delete), auto-filtered on queries |
Critical Rules
1. NEVER manually set time fields - GoFrame handles these automatically:
dao.User.Ctx(ctx).Data(do.User{
Name: "john",
CreatedAt: gtime.Now(),
UpdatedAt: gtime.Now(),
}).Insert()
dao.User.Ctx(ctx).Data(do.User{
Name: "john",
}).Insert()
2. NEVER manually add WhereNull(cols.DeletedAt) - GoFrame auto-adds soft delete filter:
dao.User.Ctx(ctx).
Where(do.User{Status: 1}).
WhereNull(cols.DeletedAt).
Scan(&list)
dao.User.Ctx(ctx).
Where(do.User{Status: 1}).
Scan(&list)
3. Use Delete() for soft delete - Framework converts to UPDATE SET deleted_at = NOW():
dao.User.Ctx(ctx).Where(do.User{Id: id}).Delete()
dao.User.Ctx(ctx).
Where(do.User{Id: id}).
Data(do.User{DeletedAt: gtime.Now()}).
Update()
Field Type Support
The deleted_at field supports multiple types:
- DateTime/Timestamp: Default, stores deletion time
- Integer: Stores Unix timestamp (seconds)
- Boolean: Stores 0/1 for deleted state
Configuration (Optional)
Time field names can be customized in config.yaml:
database:
default:
createdAt: "created_at"
updatedAt: "updated_at"
deletedAt: "deleted_at"
timeMaintainDisabled: false
GoFrame Documentation
Complete GoFrame development resources covering component design, usage, best practices, and considerations: GoFrame Documentation
GoFrame Code Examples
Rich practical code examples covering HTTP services, gRPC services, and various project types: GoFrame Examples