XORM高級操作
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"xorm.io/core"
"xorm.io/xorm"
)
func main() {
engine, err := xorm.NewEngine("mysql", "root:123@/test6?charset=utf8") // dbname是taoge
if err != nil {
fmt.Println(err)
return
}
if err := engine.Ping();err !=nil{
fmt.Println(err,"數據庫連接失敗!")
return
}
defer engine.Close()
fmt.Println("數據庫連接成功!")
//建立表字段,映射數據庫
engine.SetMapper(core.GonicMapper{})
engine.Sync2(new(PersonTable))
//判斷PersonTable表是否為空
personEmpty,err := engine.IsTableEmpty(new(PersonTable))
if err !=nil{
panic(err.Error())
}
if personEmpty{
fmt.Println("人員表為空!")
}else{
fmt.Println("人員表不為空!")
}
//映射CityTable表,並且判斷是否存在
engine.Sync2(new(CityTable))
cityExist,err := engine.IsTableExist(new(CityTable))
if err != nil{
panic(err.Error())
}
if cityExist{
fmt.Println("城市表存在")
}else {
fmt.Println("城市表不存在")
}
//方法一:查找數據值
var pers1 PersonTable
rasult1,err:=engine.Where("preson_age = ? and preson_sex = ?", 18,0).Get(&pers1)
fmt.Println(pres1.PersonSex)
fmt.Println(pres1.PersonAge)
fmt.Println(pres1.PersonName)
fmt.Println(rasult1)
//方法二:查找數據值,獲取的是多個值
var Pers2 []PersonTable
engine.Where("Person_age=? and Person_sex=? ",18,0).Find(&Pers2)
fmt.Println(Pers2)
//方法三:通過and方法查出並值
var Pers []PersonTable
engine.Where("Person_age = ?",18).And("Person_sex=?",0).And("Person_name=?","海燕").Find(&Pers3)
fmt.Println(pres3)
//方法四:使用or查詢或值
var Pers4 []PersonTable
engine.Where("Person_sex =?",0).Or("Person_name=?","海燕").Or("Person_age=?",19).Find(&Pers4)
fmt.Println(Pers4)
//方法五:使用原始sql語句進行查詢,like為模糊查詢,%前面的為以匹配首,若%放最前面表示配位尾,若首尾%中間為某值則是匹配之間有某值的value
var Pers5 []PersonTable
err = engine.SQL("select * from Person_table where Person_name like '海燕%'").Find(&Pers5)
fmt.Println(Pers5)
//方法六:排序,"Person_age"為正排序,"Person_age desc"為逆排序
var Pers6 []PersonTable
engine.OrderBy("Person_age desc").Find(&Pers6)
fmt.Println(Pers6)
//方法七:按照"Person_name","Person_age"字段查找只顯示這兩個字段,其他字段都是以0代替
var Pers7 []PersonTable
engine.Cols("Person_name","Person_age").Find(&Pers7)
fmt.Println(Pers7)
//方法八:第一步判斷是否已經有值,沒有值則插入值,可根據自己的具體邏輯修改
var Pers7 PersonTable
b,_:=engine.Where("Person_name = ?","海燕").Get(&Pers8)
if b{
fmt.Println("數據已經存在",Pers8)
}else {
fmt.Println("數據不存在")
doc1:=PersonTable{0,"海燕",18,0}
i1,_ :=engine.InsertOne(doc1)
fmt.Println("新增結果",i1)
}
//方法九:插入值Insert
personInsert1 :=PresonTable{
PresonName: "hello world",
PresonAge: 8,
PresonSex: 1,
}
personInsert2 := PresonTable{
PresonName: "bullk",
PresonAge: 12,
PresonSex: 0,
}
rowNum,err := engine.Insert(&personInsert1,&personInsert2)
fmt.Println(rowNum)//rowNum代表插入的條數
//方法十:刪除值
rowNum1,err := engine.Delete(&personInsert2)//與插入一樣可以放入多個對象
fmt.Println(rowNum1)//rowNum代表刪除的條數
//方法十一:更新操作
personInsert3 :=PresonTable{
PresonName: "hello world 海燕",
PresonAge: 8,
PresonSex: 1,
}
rowNum2,err := engine.ID(9).Update(&personInsert3)//Update后可以放多個值
fmt.Println(rowNum2)//rowNum2代表修改的個數
//方法十二:統計功能
count,err := engine.Count(new(PresonTable))
fmt.Println("表中共有",count)
//方法十三:開啟事務
session := engine.NewSession()
session.Begin()
//使用for循環做批量操作
for i:=0;i<len(personArray);i++{
_,err = session.Insert(personArray[i])
if err !=nil{
session.Rollback()//出現問題進行回滾
session.Close()//關閉事務
}
}
//沒有問題進行提交
err =session.Commit()
//關閉事務
session.Close()
if err !=nil{
panic(err.Error())
}
}
type PersonTable struct {
Id int64 `xorm:"pk autoincr"`
PersonName string `xorm:"varchar(24)"`
PersonAge int `xrom:"int default 0"`
PersonSex int `xrom:"notnull"`
}
type CityTable struct {
CityName string
CityLongitude float32
CityLatitude float32
}