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 協議》,轉載必須註明作者和本文連結