Gorm-CRUD(1)

package main

import (
	"fmt"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"github.com/jinzhu/gorm"
	"time"
)

var (
	//變量db 通過init直接初始化
	db *gorm.DB
	err error
	dbinfo string
)

const  (
	//定義db的連接信息
	dbuser string = "root"
	dbpassword  = "123456"
	dbip = "xxxxxxx"
	dbport = "3306"
	database = "users"
)
//定義user結構體
//不嵌入gorm的model
type User struct {
	//gorm.Model
	Id int
	Name string `gorm:"type:varchar(30);not null;default:' ' "`
	Password string
	Birthday time.Time
	Tel string  `gorm:"column:phone"`
	Addr string
	Descs string
}



func init() {
	//拼接數據庫連接信息
	dbinfo = fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",dbuser,dbpassword,dbip,dbport,database)
	//初始化db
	db,err  = gorm.Open("mysql", dbinfo)
	if err != nil {
		fmt.Println("mysql打開失敗",err)
		return
	}
	//創建表關聯user結構體
	db.AutoMigrate(&User{})
}

func (u *User) TableName() string {
	return "user"
}

func NewUser(name ,password ,tel ,addr,desc string,birthday time.Time) *User{
	return &User{
		Name:     name,
		Password: password,
		Birthday: birthday,
		Tel:      tel,
		Addr:     addr,
		Descs:     desc,
	}
}

func main() {
	//true之後 會把去數據庫中操作的sql打印出來
	db.LogMode(true)
	//user := NewUser("c","b","123"," "," ",time.Date(2005,6,7,1,1,1,1,time.UTC))
	//檢查主鍵是否爲空  創建信息之後會把id賦值如果連續create同一個user 因爲id相同會報錯
	//fmt.Println(db.NewRecord(user))

	//db.Create(user)
	//fmt.Println(db.NewRecord(user))
	user1 := User{}
	user2 := User{}
	//查詢符合的第一條數據  有則返回
	db.First(&user1,"password = ?","b")
	//查詢符合的最後一條數據  有則返回
	db.Last(&user2)
	//查詢符合的所有數據
	users := []User{}
	db.Find(&users)
	fmt.Println(user1,user2)
	//id 是1跟4的時候
	db.Where("id in (?)",[]int{1,4}).Find(&users)
	fmt.Println(users)
	//name=a and password=b
	db.Where("name = ? and password = ?","a","b").Find(&user1)
	fmt.Println(user1)
	//name=a password=b
	db.Where("name = ? ","a").Where("password = ?","b").Find(&user1)
	fmt.Println(user1)
	//name=a phone!=4
	var user3 User
	db.Where("name = ? ","a").Not("phone","4").Find(&user3)
	fmt.Println(user3)

	var user4 []User
	//name=c 或者phone=4
	db.Where("name = ? ","c").Or("phone = ?","4").Find(&user4)
	fmt.Println(user4)

	var user5 []User
	//只查詢name phone 也就是select name,phone from user
	db.Select([]string{"name,phone"}).Find(&user5)
	fmt.Println(user5)

	var user6 []User
	//name 降序 id升序
	//db.Order("name desc,id asc").Find(&user6)
	//表示讀取2條數據從第五條開始讀
	db.Order("name desc,id asc").Limit(2).Offset(5).Find(&user6)
	fmt.Println(user6)

	var count int
	db.Model(&User{}).Count(&count)  //查詢數據條數 也可以結合where 查詢指定的有多少條總數
	fmt.Println(count)

	var name ,password string
	rows ,_ := db.Model(&User{}).Select("name,password").Rows()
	for rows.Next(){
		rows.Scan(&name,&password)
		fmt.Println(name,password)
	}
	//查詢name跟phone字段並且按照phone字段的重複數量分組 顯示重複多少次   並且次數大於1次的
	var cont,phone  string
	rows ,_ = db.Model(&User{}).Select("name ,phone,count(*)").Group("phone").Having("count(*) > ?",1).Rows()
	for rows.Next(){
		rows.Scan(&name,&phone,&cont)
		fmt.Println(name,phone,cont)
	}

	//err判斷 有時候可能我們查詢的數據不存在那麼需要判斷
	var user7 User
	//這裏是返回一個新的db所以不能用db.error
	err := db.First(&user7,"name = ?","a").Error
	if err !=nil {
		fmt.Println(err)
	}
	user7.Name = "dashabi"
	err = db.Save(&user7).Error
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(user7)
	//批量更新某一個字段的值
	err = db.Model(&User{}).Where("id >?",4).UpdateColumn("phone","aaaaa").Error
	if err != nil {
		fmt.Println(err)
	}

	//批量更新某幾個字段的值
	err = db.Model(&User{}).Where("id >?",4).UpdateColumns(map[string]interface{}{"phone":"asdasdada","name":"woshihaoren"}).Error
	if err != nil {
		fmt.Println(err)
	}

	//批量更新
	err = db.Model(&User{}).Where("id >?",4).Updates(&User{Tel: "aaa123"}).Error
	if err != nil {
		fmt.Println(err)
	}
	//批量刪除
	err = db.Model(&User{}).Where("id >?",4).Delete(&User{}).Error
	if err != nil {
		fmt.Println(err)
	}
	//單個刪除
	db.Delete(&User{Id: 2})
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章