SQL to Go Struct
Quick Start
Convert a MySQL CREATE TABLE statement to a Go struct with tags:
- Parse the CREATE TABLE statement to extract table name, columns, and constraints
- Map each MySQL column type to corresponding Go type
- Convert snake_case column names to CamelCase field names
- Generate struct with
form,json, andxormtags
Type Mapping
For complete MySQL to Go type mappings, see type_mappings.md.
Quick Reference
| MySQL | Go | Notes |
|---|---|---|
INT | int | |
BIGINT | int64 | |
VARCHAR | string | |
TEXT | string | |
DATETIME | time.Time | |
TIMESTAMP | time.Time | |
BOOL / BIT(1) | bool | |
DECIMAL | float64 | Or custom type |
Column Name Conversion
Convert snake_case to CamelCase:
user_name → UserName
created_at → CreatedAt
user_id → UserID
api_key → APIKey
is_active → IsActive
Special cases - acronyms remain uppercase:
id→IDurl→URLuri→URI
Tag Generation
Generate three tags for each field:
form: HTTP form parameter name (snake_case)json: JSON field name (snake_case)xorm: XORM ORM column name and constraints
XORM Tag Patterns
| Constraint | Tag |
|---|---|
| Primary key | xorm:"pk" |
| Auto increment | xorm:"autoincr" |
| Not null | xorm:"not null" |
| Unique | xorm:"unique" |
| Default value | xorm:"default 'value'" |
| Nullable | xorm:"nullable" |
| Index | xorm:"index" |
| Comment | xorm:"comment 'text'" |
Combine constraints: xorm:"'user_id' pk autoincr"
Example
Input
CREATE TABLE users (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
age INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE,
bio TEXT
) COMMENT='User table';
Output
package models
import "time"
// User represents the users table
type User struct {
ID uint64 `form:"id" json:"id" xorm:"'id' pk autoincr"`
Username string `form:"username" json:"username" xorm:"'username' unique not null"`
Email string `form:"email" json:"email" xorm:"'email' not null"`
Age int `form:"age" json:"age" xorm:"'age' default 0"`
CreatedAt time.Time `form:"created_at" json:"created_at" xorm:"'created_at'"`
IsActive bool `form:"is_active" json:"is_active" xorm:"'is_active' default true"`
Bio string `form:"bio" json:"bio" xorm:"'bio'"`
}
Workflow
- Extract table info: Get table name, column definitions, constraints
- Apply type mappings: See type_mappings.md for reference
- Generate field name: Convert snake_case column to CamelCase
- Add tags: Generate form/json/xorm tags based on column attributes
- Handle special cases: Primary keys, indexes, defaults, comments
Nullable Columns
For nullable columns (allows NULL), use pointer types:
// MySQL: phone VARCHAR(20) NULL
Phone *string `form:"phone" json:"phone" xorm:"'phone' nullable"`
Struct Comment
Use table comment as struct comment, or generate from table name:
// User represents the users table