go 連線資料庫 - GORM學習 - sql查詢

yyy123456發表於2020-12-05

go 連線資料庫 - GORM學習 - sql查詢

go語言的資料庫連線使用的三方庫, 官網有中文文件,地址是 GORM指南

安裝

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

準備資料庫

假設本地 3306 埠有資料庫 mywawo,賬號 root,密碼 root
表:

CREATE TABLE `wws_user2` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `user_name` char(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '使用者真實姓名',
  `created_at` timestamp NULL DEFAULT NULL COMMENT '新增時間',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB   COMMENT='使用者表'

建好後自行插入一些資料。

程式碼 orm/orm.go

orm是自己專案的目錄。

package main

import (
    "fmt"
    "log"
    "os"
    "time"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"

    . "orm/models"
)

var db *gorm.DB

func init() {
    var err error
    dsn := "root:root@tcp(127.0.0.1:3306)/mywawo?charset=utf8mb4&parseTime=True&loc=Local"

    //  預設的級別,會列印find找不到模型時的sql語句。
    // Silent 就不會。
    newLogger := logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
        logger.Config{
            SlowThreshold: time.Second,   // Slow SQL threshold
            LogLevel:      logger.Silent, // 可選 Silent,Error,Warn,Info
            Colorful:      true,          // Disable color
        },
    )

    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger:                                   newLogger,
        DisableForeignKeyConstraintWhenMigrating: true})
    if err != nil {
        panic(err)
    }

}

func main() {

    fmt.Println("開始orm")
    var user User
    var users []User
    var result *gorm.DB
    fmt.Println("-- 查詢單個結果,想查詢主鍵為1的記錄 --")
    result = db.First(&user, 1)
    display_first(result, user)

    fmt.Println("\n-- 查詢單個結果,想查詢主鍵為2的記錄 --")
    result = db.First(&user, 2)
    display_first(result, user)

    fmt.Println("\n-- 查詢多個結果,應該無法查到結果 --")
    result = db.Where("id <  ?", 0).Order("id desc").Order("user_name").Offset(0).Limit(3).Find(&users)
    display_find(result, users)

    fmt.Println("\n-- 查詢多個結果,根據欄位 --")
    result = db.Where("id >  ?", 1).Where("user_name", "老朱").Order("id desc").Order("user_name").Offset(0).Limit(3).Find(&users)
    display_find(result, users)

    fmt.Println("\n-- 查詢多個結果,根據欄位,分開拼接sql --")
    where := db
    where = where.Where("id >  ?", 1)
    where = where.Order("id desc")
    where = where.Order("user_name")
    where = where.Offset(1)
    where = where.Limit(4)
    result = where.Find(&users)
    display_find(result, users)

}

func display_first(tx *gorm.DB, obj interface{}) {
    if err := tx.Error; err != nil {
        fmt.Println("單個結果查詢,沒找到結果")
    } else {
        fmt.Println(obj)
    }
}

func display_find(tx *gorm.DB, arr interface{}) {
    switch arr.(type) {
    case []User:
        //fallthrough
        arr2 := arr.([]User)
        if tx.RowsAffected == 0 {
            fmt.Println("多個結果查詢,沒找到結果")
        } else {
            fmt.Println("多個結果查詢,查到結果了。")
            fmt.Println(arr2)
        }
    }

}

程式碼 orm/models/user.go

package models

import (
    "database/sql"
    "time"
)

type User struct {
    ID        uint
    UserName  sql.NullString
    CreatedAt time.Time
    UpdatedAt time.Time
}

// TableName 會將 User 的表名重寫為 `profiles`
func (User) TableName() string {
    return "wws_user2"
}

最後執行結果

開始orm
-- 查詢單個結果,想查詢主鍵為1的記錄 --
{1 {張三 true} 2019-03-19 16:20:18 +0800 CST 2019-11-05 11:28:18 +0800 CST}

-- 查詢單個結果,想查詢主鍵為2的記錄 --
單個結果查詢,沒找到結果

-- 查詢多個結果,應該無法查到結果 --
多個結果查詢,沒找到結果

-- 查詢多個結果,根據欄位 --
多個結果查詢,查到結果了。
[{37 {老朱 true} 2019-08-26 16:04:10 +0800 CST 2019-09-04 20:39:42 +0800 CST}]

-- 查詢多個結果,根據欄位,分開拼接sql --
多個結果查詢,查到結果了。
[{54 {謝謝你 true} 2020-04-21 20:15:25 +0800 CST 2020-04-21 20:15:25 +0800 CST} {53 {cvc true} 2020-02-22 15:33:33 +0800 CST 2020-02-22 15:33:52 +0800 CST} {52 {jxf true} 2020-02-22 15:14:58 +0800 CST 2020-02-22 15:33:49 +0800 CST} {51 {是多少 true} 2020-02-22 15:14:07 +0800 CST 2020-02-22 15:33:44 +0800 CST}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章