Models
- Model Defination
 - Conventions & Overriding Conventions
gorm.Modelstruct- Table name is the pluralized version of struct name
 - Column name is the snake case of field's name
 - Field 
IDas primary key - Field 
CreatedAtused to store record's created time - Use 
UpdatedAtused to store record's updated time - Use 
DeletedAtto store record's deleted time if field exists 
 
Model Defination
type User struct {
  gorm.Model
    Birthday     time.Time
    Age          int
    Name         string  `sql:"size:255"` // Default size for string is 255, you could reset it with this tag
    Num          int     `sql:"AUTO_INCREMENT"`
    IgnoreMe     int `sql:"-"`   // Ignore this field
}
Conventions & Overriding Conventions
gorm.Model struct
Gorm has defined struct gorm.Model, which could be embeded in your models, it will add fields ID, CreatedAt, UpdatedAt, DeletedAt to your model
// Model's definition
type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}
Table name is the pluralized version of struct name
type User struct {} // default table name is `users`
// set User's table name to be `profiles
type (User) TableName() string {
  return "profiles"
}
func (u User) TableName() string {
    if u.Role == "admin" {
        return "admin_users"
    } else {
        return "users"
    }
}
// Disable table name's pluralization globally
db.SingularTable(true) // if set this to true, `User`'s default table name will be `user`, table name setted with `TableName` won't be affected
Column name is the snake case of field's name
type User struct {
  ID uint             // column name will be `id`
  Name string         // column name will be `name`
  Birthday time.Time  // column name will be `birthday`
  CreatedAt time.Time // column name will be `created_at`
}
type Animal struct {
    AnimalId    int64     `gorm:"column:beast_id"`         // set column name to `beast_id`
    Birthday    time.Time `gorm:"column:day_of_the_beast"` // set column name to `day_of_the_beast`
    Age         int64     `gorm:"column:age_of_the_beast"` // set column name to `age_of_the_beast`
}
Field ID as primary key
type User struct {
  ID uint  // field named `ID` is the default primary key for `User`
  Name string
}
// your could also use tag `primary_key` to set other field as primary key
type Animal struct {
  AnimalId int64 `gorm:"primary_key"` // set AnimalId to be primary key
  Name     string
  Age      int64
}
Field CreatedAt used to store record's created time
Create records having CreatedAt field will set it to current time.
db.Create(&user) // will set `CreatedAt` to current time
// To change its value, you could use `Update`
db.Model(&user).Update("CreatedAt", time.Now())
Use UpdatedAt used to store record's updated time
Save records having UpdatedAt field will set it to current time.
db.Save(&user) // will set `UpdatedAt` to current time
db.Model(&user).Update("name", "jinzhu") // will set `UpdatedAt` to current time
Use DeletedAt to store record's deleted time if field exists
Delete records having DeletedAt field, it won't delete the record from database, but will set field DeletedAt's value to current time.