var deviceInfo model.DeviceInfo
err := conn.Where("monitor_id = ?", monitorId).First(&deviceInfo).Error
if err == gorm.ErrRecordNotFound {
//记录存在
}
Last active
May 7, 2021 06:29
-
-
Save SolemnJoker/52df54c20404c88e97a213c1ea5215b2 to your computer and use it in GitHub Desktop.
[gorm库] go操作数据库 gorm框架代码片段#go #gorm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
获取匹配的第一条记录, 否则根据给定的条件创建一个新的记录 (仅支持 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"} | |
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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