go语言学习第九天==》gorm包数据库操作demo
- gorm包的使用
gorm文档:http://gorm.book.jasperxu.com/models.html
一个demo:
package main
import(
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"time"
"fmt"
)
type User struct{
Id int16 `gorm:"primary_key"`
Name string `type:"varchar(20)"`
CreateTime time.Time
}
func main(){
db,err:=gorm.Open("mysql",
"root:tiger@/testgo?charset=utf8&parseTime=True&loc=Local")
if err!=nil{
//数据库错误处理
fmt.Println("call me dad")
}
//设置最大打开连接,默认0即不限制
db.DB().SetMaxIdleConns(10)
//设置闲置连接数
db.DB().SetMaxOpenConns(100)
// ====================================================
// 可以修改默认表名
// func (User) TableName() string {
// return "user"
// }
// // 全局禁用表名复数
// db.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响
// //指定表名增删改查都可使用db.Table("表名").操作
// 根据结构体创,指定表名创建表
if !db.HasTable(&User{}){
if err=db.Table("userrr").Set("gorm:table_options",
"ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(
&User{}).Error;err!=nil{
//错误处理
}
}
//
//不指定表名创建,这里结构体为User,则默认表名为users
//直接使用createTable即可,还可以使用set设置一些参数
if !db.HasTable(&User{}){
if err=db.Set("gorm:table_options",
"ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(
&User{}).Error;err!=nil{
//错误处理
}
}
var user1 = User{
Id: 1,
Name: "qqq",
CreateTime: time.Now(),
}
user2:=&User{
Id: 2,
Name: "www",
CreateTime: time.Now(),
}
/**********插入***************************************/
///通过结构体类型自动匹配表名进行插入
///如:这里user1类型为User则将在users表中进行插入
///==================================================
if err=db.Create(user1).Error;err!=nil{
//处理第一条数据插入错误
}
//指定表名插入 插入的结构体数据字段可以少于表字段但是不能多
if err=db.Table("userrr").Create(user1).Error;err!=nil{
//处理第一条数据插入错误
}
if err=db.Create(user2).Error;err!=nil{
//处理第二条数据插入错误
}
if err=db.Create(
&User{
Id: 3,
Name: "eee",
CreateTime: time.Now(),
}).Error;err!=nil{
//处理第三条数据插入错误
}
/*******删除****************************/
///直接删存在的记录================================
///通过参数结构体类型自动匹配数据库表进行插入
///这里uesr1类型为User,则将在users表进行插入
db.Delete(user1)
//添加where语句筛选删除
db.Where("id=? and name like ?",2,"%w_").Delete(User{})
//指定表名删除 结构体数据字段可以少于表字段但是不能多
db.Table("userrr").Delete(user1)
// db.Table("userrr").Where("id=? and name like ?",3,"%").Delete(User{})
/
var user User
var users []User
/****************查询**************************/
/****************查询**************************/
///直接查询===================================================
///根据结构体参数类型自动匹配表名
///因为user变量是User类型 ,所以执行First将会到数据库users表中查询第一条
db.First(&user)
fmt.Println(user)
///最后一条
db.Last(&user)
///全部查询
db.Find(&users)
fmt.Println(users)
///==========================================================
///条件查询 普通
rows:=db.Where("id=? and name like ?",3,"%e").Rows()
for rows.Next() {
// rows.Scan(&id, &name, &createtime)
}
db.Where("id=? and name like ?",3,"%e").First(&user)
db.Where("id <> ?",1).First(&user)
fmt.Println("条件查询=",user)
///条件查询 结构体/map作为where条件
///这句话是查不出来的因为CreateTime
db.Where(&User{Id:3,Name:"eee",CreateTime:time.Now()}).First(user)
fmt.Println("条件查询=结构体",user)
//数据库里面的字段必须包含map里面的字段名
db.Where(map[string]interface{}{"Id":3,"Name":"eee","create_time":time.Now()}).First(user)
fmt.Println("条件查询=Map",user)
//map和结构体的字段必须>=数据库列数
db.Find(&user,"id<>? and Name=?",3,"%e")
fmt.Println("条件查询",user)
//Or或者查询
db.Where("id<>? and Name=?",3,"%e").Or("id<>? and Name=?",3,"%e").Find(&user)
fmt.Println("Or条件查询",user)
// 指定表查询===============================================
//结构体字段首字母一定要大写
//查询一部分到另一个结构体
type Info struct{
Id int16
Name string
}
var info Info
db.Table("users").Select("id,name").Where("id=?",3).Scan(&info)
fmt.Println("指定表查询",info)
db.Raw("SELECT id, name FROM users WHERE id = ?", 1).Scan(&info)
fmt.Println("指定表查询",info)
// =========================================================
///可执行原生sql
db.Exec("DROP TABLE uuserrr;")
db.Exec("UPDATE users SET name=? WHERE id = ?", "cvcvcv", 3)
user777:=User{
Id: 3,
Name: "kkkkkkkkkkkkkk",
CreateTime: time.Now(),
}
/****************更新**************************/
/****************更新**************************/
/更新全部字段
//不指定表名更新
db.Save(&user777)
//指定表名更新 更新的user字段可以少于等于结构体字段
db.Table("userrr").Save(&user777)
/更新部分字段
// 不指定表名更新
db.Model(&user777).Update("name","qqqqqqqqqqq")
//指定表名更新
db.Table("userrr").Where("id=?",3).Update("name","qqqqqqq")
//使用Map更新字段 更新的条件是where id=user777.id
//map数据库字段里可以不包含map里面的字段,即只更新map和数据库字段的交集字段
db.Model(&user777).Updates(map[string]interface{}{"name":"iiiiiiiiiiiiiiiii","CreateTime":time.Now(),"dad":"me"})
//指定表名使数据库字段必须包含map里的字段
db.Table("userrr").Where("id=?",3).Updates(map[string]interface{}{"name":"rrrrrr","create_time":time.Now()})
//使用struct更新,只会更新这些更改的和非空白字段
db.Model(&user777).Where("id=?",3).Updates(User{Name:"hhhhhhhh",CreateTime:time.Now()})
//指定表名使用struct更新
db.Table("userrr").Where("id=?",3).Updates(User{Name:"hhhhhhhh",CreateTime:time.Now()})
}