Go语言操作mysql的第三方包 gorm
2018-11-08 17:43
351 查看
初始化
gorm.Open返回的是连接池 如下方法可以做连接池配置: db.DB().SetMaxIdleConns(10) db.DB().SetMaxOpenConns(100) argsStr :="root:123456@tcp(10.58.17.238:3306)/wz?charset=utf8&parseTime=True&loc=Local" db, err := gorm.Open("mysql", argsStr) if err != nil { log.Println("mysql数据库连接失败:", err) }
表结构操作
//列名是字段名的蛇形小写 //字段`ID`为默认主键 //使用tag`primary_key`用来设置主键: AnimalId int64 `gorm:"primary_key"` // 设置AnimalId为主键 db.Debug().AutoMigrate(&mydb.People{})//自动迁移 更新表结构,只会添加缺少的字段,不会删除/更改当前数据 db.CheckTables(gormDb)//创建数据表 gormDb.Debug().HasTable(&mydb.People{})//判断数据表是否存在 gormDb.DropTable(&mydb.People{}, "products").Error//删除数据表,不存在提示报错 gormDb.DropTableIfExists(&mydb.People{}, "products").Error////删除数据表,不存在不报错 gormDb.Model(&mydb.People{}).ModifyColumn("xxx", "text")// 修改模型`User`的xxx 列的数据类型为`text` gormDb.Model(&mydb.People{}).DropColumn("xxx")// 删除模型`User`的xxx列 gormDb.Model(&mydb.People{}).AddIndex("xxx", "name", "age")// 为`name`, `age`列添加索引`xxx` gormDb.Model(&mydb.People{}).AddUniqueIndex("xxx", "name", "age")// 为多列添加唯一索引 gormDb.Model(&mydb.People{}).RemoveIndex("xxx")// 删除索引 gormDb.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响
新增
db.Set("gorm:insert_option", "ON CONFLICT").Create(&product)
删除
db.Unscoped().Delete(&p)//使用Unscoped永久删除记录
修改
//1 更新全部字段:Save将包括执行更新SQL时的所有字段,即使它没有更改 var p People db.First(&p) p.Name = "jinzhu 2" p.Age = "100" db.Save(&p) //2 只更新 更改的字段,可以使用Update, Updates var p People db.Debug().First(&p) db.Debug().Model(&p).Update("name", "hello") //对于结构体的更新 Updates 如果该字段的值时该类型的空值,则该字段不会被更新 db.Debug().Model(&p).Updates(People{Name: "hello", Age: ""}) //select时选择更新的字段,如果选择的字段为空值那么就不会更新该字段,都为空值则不执行该语句 //Omit是选择不更新的字段 db.Debug().Model(&p).Select("age").Updates(People{Name: "hello", Age: ""})
查询
// 使用主键获取记录 db.First(&user, 10) //// SELECT * FROM users WHERE id = 10; var ps []People db.Debug().Where("name <> ?", "jinzhu").Find(&ps)//找出name不是jinzhu的数据 //SELECT * FROM `peoples` WHERE `peoples`.`deleted_at` IS NULL AND ((name <> 'jinzhu')) db.Where("name in (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users) db.Where("name LIKE ?", "%jin%").Find(&users) db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users) db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users) db.Where(&People{Name: "jinzhu", Age: "20"}).Find(&ps) db.Not("name", []string{"jinzhu", "jinzhu 2"}).Find(&ps) db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&ps) //// SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin'; //当使用struct查询时,GORM将只查询那些具有值的字段 db.Select("name, age").Find(&ps)// SELECT name, age FROM users; db.Select([]string{"name", "age"}).Find(&ps)// SELECT name, age FROM users; //虽然查询和count再一句话中,但是执行了两个sql语句,所以建议分两次查询 var num int db.Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Find(&ps).Count(&num) // SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users) // SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count) //将结果扫描到另一个结构中。 var result Result db.Table("users").Select("name, age").Where("name = ?", 3).Scan(&result)
其他
//Scan只能接收切片和结构体 rows:=db.Debug().Exec("show tables;").Scan(&r1)//scan should be slice or struct db.Debug().Raw("show tables;").Scan(&r2)//scan should be slice or struct //Exec只用于数据表的查询 //Raw用于执行数据库命令 row2:=db.Debug().Raw("show tables;").Row() row2.Scan(&r2) rows2,_:=db.Debug().Raw("show tables;").Rows() defer rows2.Close() for rows2.Next(){ rows2.Scan(&r2) fmt.Println("r2:",r2) }
相关文章推荐
- GO语言操作MySQL
- 一些mysql的知识以及go语言操作mysql,mysqld服务
- go语言学习----mysql的操作
- Node.js中JavaScript操作MySQL的常用方法整理
- Linxu系统下MySQL常见操作命令详细解读
- 使用mysql的binlog恢复误操作(update|delete)的数据
- MySQL常用操作
- 大数据IMF传奇行动绝密课程第68课:Spark SQL通过JDBC操作MySQL
- jsp操作MySQL实现查询/插入/删除功能示例
- [置顶] 【go语言读取mysql】go语言连接mysql,并且查询出结果
- php中对MYSQL操作之事务控制,回滚
- Python操作mysql
- MySQL学习笔记_9_MySQL高级操作(上)
- mysql日期查询操作
- MYSQL -- 其他操作
- MySql常用操作,备份,维护!
- 苹果ipad教程] iTunes如何备份数据及操作文件(仅限于备份非资料库信息,第三方软件不限)
- Mysql的简单操作
- MySQl操作整理01
- MySQL 系列(二) 你不知道的数据库操作