- 1 SetMaxIdleConns 设置闲置的连接数
- 2 SetMaxOpenConns 用于设置最大打开的连接数,默认值为0表示不限制。
返回数据库主键ID
// 1首先可以在数据库建好表,或者在配置文件中把建表语句准备好,利用ROM机制自己生成表
CREATE table demo(
id INT(11) unsigned NOT NULL AUTO_INCREMENT;
Name varchar(250) NOT NULL ;
PARMARY KEY(`id`)
)ENGINE=InnoDB auto_increment=0 default 0 charset=utf8mb4;
gorm 是基于database/sql封装的,用之前得启用引擎
- Find()方法可以接受struct和slice的数据。
import (
"github.com/jinzhu/gorm"
_"github.com/jinzhu/gorm/dialects/mysql" //引擎
"fmt"
)
// 定义全局的gorm连接对象
type GormDB struct{
Conn *gorm.DB
DbApi string
}
// 设置utf8mb4支持更多编码!
func ConnGorm(userName, passWord, dbName string)*GormDB{
connInfo := fmt.Sprintf("%s:%s@tcp(127.0.0.1:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local", userName, passWord, dbName)
return &GormDB{DbApi:connInfo}
}
func main() {
var err error
// 只要拿到conn对象就能随意调 其他方法了,因为都绑定在同一个结构体上!
gormConn := ConnGorm("root","123456","youdu")
gormConn.Conn, err = gorm.Open("mysql", gormConn.DbApi)
if err!=nil{
fmt.Println(222,err)
}
defer gormConn.Conn.Close()
// 2修改数据
gormConn.insertData()
}
type Test struct {
// Id int64 `json:"id"`
Name string `json:"name"`
// Age int64 `json:"age"`
}
// 查询test表的name字段的所有数据 []Test 格式 后缀Error是用来判断err!=nil用的!
func (g *GormDB)insertData(){
var tests []Test
if err2 := g.Conn.Table("test").Select("name").Find(&tests).Error; err2 != nil{
fmt.Println(3333,err2)
}
fmt.Println(tests)
}
查询主键:id
func (g *GormDB)selectMainId(){
var id Test //必须声明结构体类型接收数据
if e:=g.Conn.Table("test").Select("id").Where("name=?","223").Find(&id).Error;e!=nil{
fmt.Println(e)
}
fmt.Println(id.Id)
}
Error是用来查询判断成功与否
- 1 Row() 是查询一行用的,Rows()是查询多行用的,用Row()也能判断查询成功与否
//查询主键ID, Row必须放在Scan()前面才行,下面这个语句不用Error也能判断查询成功与否!
var id uint
if err := g.Conn.Table(name).Where("name=?", d.Name).Select("id").Row().Scan(&id); err != nil {
fmt.Println("id__:", id, err)
}
聚合函数BUG count(*) 一定要放在最后面!!!
SELECT
s.task_id,
s.STATUS,
s2.user_login,
s.wx_type,
s.created_at,
s.`status`,
s.add_id,
count( * ) as count
FROM
batch_add_friends AS s
JOIN sys_user AS s2 ON s.user_id = s2.id
GROUP BY
s.task_id,
s.`status`
update_time, create_time自动更新的问题
// update_time,create_time 设置成CURRENT_TIMESTAMP,就会根据操作的时间来更新成当前时间
DEFAULT CURRENT_TIMESTAMP:表示当插入数据的时候,该字段默认值为当前时间
ON UPDATE CURRENT_TIMESTAMP:表示每次更新这条数据的时候,该字段都会更新成当前时间
批量插入数据
- 1 以md5_phone字段进行去重!
- 2 Omit( ) 忽略指定的字段值
t.DB.Table(t.TableName()).Clauses(
clause.OnConflict{ //重复数据处理
Columns: []clause.Column{{Name: "md5_phone"}},
DoNothing: true,
}).Omit("created_at", "updated_at").Create(t).Error;
)
翻页
err := db.Order("wechat_add_friends.created_at desc").Offset((currentPage - 1) * pageSize).Limit(pageSize).Find(&addFriends).Offset(-1).Limit(-1).Count(&count).Error;
gorm.Model
- 对于一张数据表的每一条数据来说,都有自增主键,创建、更新与删除时间等比较通用的字段,GORM将其抽出来并定义了gorm.Model,避免重复建设字段!
gorm文档: