参考链接
数据库连接格式
user:password@(localhost)/dbname?charset=utf8&parseTime=True&loc=Local
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/go-sql-driver/mysql"
"log"
)
type UserInfo struct{
gorm.Model
UserName string `gorm:"size:255;column:username"`
Password string `gorm:"size:255;column:password"`
}
// 设置表名
func (UserInfo) TableName() string{
return "user_info"
}
func main(){
// 连接数据库
//"user:password@/dbname?charset=utf8&parseTime=True&loc=Local"
db, err := gorm.Open("mysql", "root:111111@/test?charset=utf8&parseTime=True&loc=Local")
if err != nil{
log.Println("err->", err)
}
defer db.Close()
// 不存在表则自动生成
if !db.HasTable(&UserInfo{}){
db.AutoMigrate(&UserInfo{})
log.Println("create table...")
}
// 创建数据
user := UserInfo{UserName:"admin", Password:"111111"}
db.NewRecord(user)
db.Create(&user)
if ! db.NewRecord(user){
fmt.Println("create ok")
}else{
fmt.Println("create fail")
}
// 普通查询
//select_data(db)
// 条件查询
//where_select(db)
// 更新全部字段
//update_all(db)
// 更新某个字段
//update(db)
// 删除指定数据
//delete(db)
// 删除符合条件的所有数据
//delete_all(db)
}
// 查询数据
func select_data(db *gorm.DB){
// 获取第一条记录,按主键排序
var u_first UserInfo
db.First(&u_first)
fmt.Println(u_first.UserName)
fmt.Println(u_first.Password)
// 查询最后一条数据
var u_last UserInfo
db.Last(&u_last)
fmt.Println(u_last.UserName)
fmt.Println(u_last.Password)
// 查询所有记录
var users []UserInfo
db.Find(&users)
for _, val := range users{
fmt.Println(val.UserName)
fmt.Println(val.Password)
}
// 使用主键获取记录
var user_pk UserInfo
db.First(&user_pk, 1)
fmt.Println(user_pk.UserName)
fmt.Println(user_pk.Password)
}
// 条件查询
func where_select(db *gorm.DB){
// 获取第一个匹配记录
var user UserInfo
db.Where("username=?", "admin").First(&user)
fmt.Println(user.UserName)
fmt.Println(user.Password)
// 获取所有匹配记录
var users []UserInfo
db.Where("username=?", "admin").Find(&users)
for _, v := range users{
fmt.Println(v.UserName)
fmt.Println(v.Password)
}
// 查询链
var u1 UserInfo
db.Where("username=?", "admin").Where("password=?", "222222").First(&u1)
fmt.Println(u1.UserName)
fmt.Println(u1.Password)
}
// 更新全部字段
func update_all(db *gorm.DB){
var user UserInfo
db.Where("username=?", "admin").First(&user)
user.UserName = "xiaoming"
user.Password = "xiaoming"
db.Save(&user)
}
// 更新某个字段
// 更新更改的字段,可以使用Update, Updates
func update(db *gorm.DB){
var user UserInfo
db.Where("username=?", "admin").Where("password=?", "222222").First(&user)
db.Model(&user).Update("username", "zhangsan")
fmt.Println(user.UserName)
fmt.Println(user.Password)
}
//软删除
// 删除记录时,需要确保其主要字段具有值,GORM将使用主键删除记录,如果主要字段为空,GORM将删除模型的所有记录
func delete(db *gorm.DB){
var user UserInfo
db.Where("username=?", "admin").Where("password=?", "999").First(&user)
db.Delete(&user)
}
// 删除所有匹配的数据, 软删除
func delete_all(db *gorm.DB){
db.Where("password LIKE ?", "%33%").Delete(UserInfo{})
}
数据库连接配置
config.ini
[mysql]
host = 127.0.0.1
port = 3306
username = root
password = 111111
database = test
main.go
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"gopkg.in/ini.v1"
)
// 读取配置文件
func readConfig()(host, username, password, database string, port int){
cfg, err := ini.Load("config.ini")
getErr("load config", err)
host = cfg.Section("mysql").Key("host").String()
port, err = cfg.Section("mysql").Key("port").Int()
getErr("get port", err)
username = cfg.Section("mysql").Key("username").String()
password = cfg.Section("mysql").Key("password").String()
database = cfg.Section("mysql").Key("database").String()
return
}
// 连接mysql
func connectDataBase() *gorm.DB{
host, username, password, database, port := readConfig()
db_connect_str := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
username, password, host, port, database)
fmt.Println(db_connect_str)
db, err := gorm.Open("mysql", db_connect_str)
getErr("connect mysql", err)
return db
}
type User struct{
gorm.Model
Username string `gorm:"size:255;column:username"`
Password string `gorm:"size:255;column:password"`
}
func main() {
db := connectDataBase()
defer db.Close()
if !db.HasTable(&User{}){
db.AutoMigrate(&User{})
}
}
// 捕获异常
func getErr(msg string, err error){
if err != nil{
fmt.Println("--------------------------------------------")
fmt.Printf("%v err->%v\n", msg, err)
fmt.Println("--------------------------------------------")
}
}
示例
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/go-sql-driver/mysql"
"log"
)
type User struct{
Id int `gorm:"column:id;primary_key"`
UserName string `gorm:"column:username"`
Password string `gorm:"column:password"`
}
func main() {
db, err := gorm.Open("mysql", "root:fanhaokj@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True")
if err != nil{
log.Println(err)
}
if !db.HasTable(&User{}){
db.AutoMigrate(&User{})
}
}
// 创建数据
func create(db *gorm.DB){
var user User
user.UserName = "admin"
user.Password = "111111"
db.Create(&user)
if !db.NewRecord(user){
fmt.Println("create success")
}else{
fmt.Println("create fail")
}
}
// 删除符合条件的第一个
func delete(db *gorm.DB){
var user User
db.Where("username=?", "admin").Where("password=?", "111111").First(&user)
// // 使用Unscoped永久删除记录
rows := db.Unscoped().Delete(&user).RowsAffected
fmt.Println("受影响行数->", rows)
if !db.NewRecord(user){
fmt.Println("delete success")
}else{
fmt.Println("delete fail")
}
}
// 删除所有符合条件的
func deleteAll(db *gorm.DB){
var users []User
db.Where("username=?", "admin").Where("password=?", "111111").Find(&users)
rows := db.Delete(&users).RowsAffected
fmt.Println("受影响的行数->", rows)
}
// 更新符合条件的第一条数据
func update(db *gorm.DB){
var user User
db.Where("username=?", "admin").Where("password=?", "111111").First(&user)
user.UserName = "goubuli"
user.Password = "88888888"
row := db.Save(&user).RowsAffected
fmt.Println("受影响的行数->", row)
if !db.NewRecord(user){
fmt.Println("modify success")
}else{
fmt.Println("modify fail")
}
}
// 更新所有符合条件的数据
func updateAll(db *gorm.DB){
var users []User
db.Where("username=?", "admin").Where("password=?", "111111").Find(&users)
row := db.Model(&User{}).Where("username=?", "zhubuli").
Where("password=?", "111111").
Update("username", "zhubuli").Update("password", "999").RowsAffected
fmt.Println("受影响的行数->", row)
}