Skip to content

Instantly share code, notes, and snippets.

@SolemnJoker
Last active May 7, 2021 06:29
Show Gist options
  • Save SolemnJoker/52df54c20404c88e97a213c1ea5215b2 to your computer and use it in GitHub Desktop.
Save SolemnJoker/52df54c20404c88e97a213c1ea5215b2 to your computer and use it in GitHub Desktop.
[gorm库] go操作数据库 gorm框架代码片段#go #gorm
获取匹配的第一条记录, 否则根据给定的条件创建一个新的记录 (仅支持 struct 和 map 条件)
```
// 未找到
db.FirstOrCreate(&user, User{Name: "non_existing"})
//// INSERT INTO "users" (name) VALUES ("non_existing");
//// user -> User{Id: 112, Name: "non_existing"}
// 找到
db.Where(User{Name: "Jinzhu"}).FirstOrCreate(&user)
//// user -> User{Id: 111, Name: "Jinzhu"}
```

判断记录是否存在

   var deviceInfo model.DeviceInfo
   err := conn.Where("monitor_id = ?", monitorId).First(&deviceInfo).Error                                                          
   if err == gorm.ErrRecordNotFound { 
     //记录存在
   }
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
if !db.HasTable(&model.ProjectIdRelate{}) {
db.CreateTable(&model.ProjectIdRelate{})
}
if !db.HasTable(&model.DeviceInfo{}) {
db.CreateTable(&model.DeviceInfo{})
}
defer db.Close()
}

插入数据

menu = &Menu{
	Id:        0,
	Title:     col4,
	Pid:       col3_id,
	Important: 0,
	PowerType: kk,
	Type:      0,
}
dd := db.Create(menu)
id := menu.Id

err := dd.Error
  • 如果Menu.Id是自增主键,则调用db.Create(menu)后menu.Id是自增主键的值
  • Create返回的是*DB,调用dd.Error可以读取最后一次执行sql语句的error

gorm select

rows, err := db.Table("mycms_task").Select("task_id,token").Rows()

打印*sql.Row

        rows, err := db.Table("mycms_task").Select("task_id,token").Rows()
		if err != nil {
			stark.Logger.Error(ctx, err.Error())
			return
		}
		columns, _ := rows.Columns()
		columnLength := len(columns)
		cache := make([]interface{}, columnLength) //临时存储每行数据
		for index, _ := range cache {              //为每一列初始化一个指针
			var a interface{}
			cache[index] = &a
		}
		var list []map[string]interface{} //返回的切片
		for rows.Next() {
			_ = rows.Scan(cache...)

			item := make(map[string]interface{})
			for i, data := range cache {
				item[columns[i]] = *data.(*interface{}) //取实际类型
			}
			list = append(list, item)
			fmt.Println(string(item["task_id"].([]byte)), string(item["token"].([]byte)))
		}
		_ = rows.Close()

打印sql.Rows函数

func printRow(rows *sql.Rows) {

	columns, _ := rows.Columns()
	columnLength := len(columns)
	cache := make([]interface{}, columnLength) //临时存储每行数据
	for index, _ := range cache {              //为每一列初始化一个指针
		var a interface{}
		cache[index] = &a
	}
	var list []map[string]interface{} //返回的切片
	for rows.Next() {
		_ = rows.Scan(cache...)

		item := make(map[string]interface{})
		for i, data := range cache {
			item[columns[i]] = *data.(*interface{}) //取实际类型
			fmt.Printf(string(item[columns[i]].([]byte)) + " ")
		}
		fmt.Println()
		list = append(list, item)
	}
	_ = rows.Close()
}

在使用gorm查询数据保存时,可以通过Scan快速方便地将数据存储到指定数据类型中,减少数据的手动转存及赋值过程。

使用示例:

type Result struct {
    Name string
    Age  int
}

var result Result
db.Table("users").Select("name, age").Where("name = ?", 3).Scan(&result)

// Raw SQL
db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)

gorm如何给某条记录的一个字段值 +1或-1

DB.Model(&product).UpdateColumn("quantity", gorm.Expr("quantity - ?", 1))
//// UPDATE "products" SET "quantity" = quantity - 1 WHERE "id" = '2';
func InsertOrUpdate(columnName string,value string,row RowStuct) {
err := conn.Where(columnName+" = ?", value).First(row).Error
if err == gorm.ErrRecordNotFound {
conn.Create(row)
} else if err != nil {
stark.Logger.Errorf(context.Background(), "mysql 错误,%s", err.Error())
return err
}
}
// Package mysql provides ...
package mysql

import (
	"fmt"
	"time"
    _ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

var db *gorm.DB

func GetDB() *gorm.DB{
  if db == nil{
    db = Setup()
    return db
  }
   if err := db.DB().Ping(); err != nil {
      db.Close()
      db = Setup()
   }
   return db
}

func newConnect() *gorm.DB{
  goDbStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
    Config.DbUser,
    Config.DbPasswd,
    Config.DbUrl,
    Config.DbPort,
    Config.DbName)
  conn, err := gorm.Open("mysql", goDbStr)
  if err != nil {
    vars.Logger.Error(err.Error())
    return conn
  }
  return conn
}
func Setup() *gorm.DB{
   db = newConnect()
   db.DB().SetMaxIdleConns(10)                   //最大空闲连接数
   db.DB().SetMaxOpenConns(30)                   //最大连接数
   db.DB().SetConnMaxLifetime(time.Second * 300) //设置连接空闲超时
   return db
   //db.LogMode(true)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment