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
}