XORM高级操作

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
}
posted @ 2020-08-24 14:57  MiaoQinHong  阅读(1191)  评论(0编辑  收藏  举报