go语言学习第九天==》gorm包数据库操作demo

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()})

}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值