gorm使用


1. introduction

讀完官網的例子就差不多了。
https://gorm.io/zh_CN/docs/index.html
https://gorm.io/zh_CN/docs/conventions.html

2. 例子

package main

import (
  "github.com/jinzhu/gorm"
  _ "github.com/jinzhu/gorm/dialects/sqlite"
)

type Product struct {
  gorm.Model
  Code string
  Price uint
}

func main() {
  db, err := gorm.Open("sqlite3", "test.db")
  if err != nil {
    panic("failed to connect database")
  }
  defer db.Close()

  // Migrate the schema
  db.AutoMigrate(&Product{})

  // 創建
  db.Create(&Product{Code: "L1212", Price: 1000})

  // 讀取
  var product Product
  db.First(&product, 1) // 查詢id為1的product
  db.First(&product, "code = ?", "L1212") // 查詢code為l1212的product

  // 更新 - 更新product的price為2000
  db.Model(&product).Update("Price", 2000)

  // 刪除 - 刪除product
  db.Delete(&product)
}

3. gorm.Model

type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}

嵌了gorm.Model就相當於加了4個字段,ID是主鍵。gorm會給DeletedAt字段創建索引。

不內嵌gorm.Model也行,可以自己指定primary key。

4. table name

db.Create(&Product{Code: "L1212", Price: 1000})

db的操作是直接create,沒有指定table,默認會將struct的名字的復數當成表名。
你也可以通過db.SingularTable(true) 來禁止變成復數,或者通過db.Table(..).來指定table。

5. 時間類型

time.Time ,但是如果這個字段為空,想設成NULL ,那么就需要定義成*time.Time指針。
字符串到時間的轉化可以用time.Parse()。

6. gorm在mysql下亂碼問題

這個有點蛋疼,用sqlite3一點亂碼問題都沒有,用mysql,中文死活插入不了,

光在mysql連接串里面指定utf 把是不行的

db, err = gorm.Open("mysql","gorm:gorm@tcplocalhost:9910)/gorm?charset=utf8mb4,utf8&parseTime=True")

修改mysql 配置:

    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    character-set-server=utf8

然后再設置 table_options,

db.Set("gorm:table_options", "CHARSET=utf8").AutoMigrate{ ... }

可以解決亂碼問題,如果遇到此類問題,用show create table查看table的charset,如果不是utf8,就就說明gorm生成的時候有問題,通過上面的語句能修正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM