yzgblogs

一、xorm框架知识介绍

xorm安装

 go get github.com/go-xorm/xorm

mysql连接示例

本节内容中,我们将以连接mysql为案例,演示xorm的相关操作。

  • 创建引擎

 engine, err := xorm.NewEngine(driverName, dataSourceName)

如上通过xorm.NewEngine方法创建一个数据库操作引擎,该方法需要两个参数:driveName和dataSourceName。在mysql引擎连接中,两个参数如下:

 driverName := "mysql"
 dataSrouceName := "用户名:密码@/数据库名称?charset=utf8"

另外,需要格外注意一点,需要在使用数据库引擎创建的地方导入对应的数据库引擎驱动,比如本节内容中的mysql数据库,引擎导入语句如下:

 _ "github.com/go-sql-driver/mysql"

mysql连接配置

  • 设置自动同步结构体到数据库 xorm框架的engine数据库引擎,提供了engine.Sync()方法,允许开发者将自定义的结构体同步到数据库中。 随着xorm框架不断更新和迭代,在Sync方法的基础上,又提供了Sync2方法,用于将结构体同步更新到数据库中。Sync2方法主要的特性是:

    • 自动检测和创建表

    • 自动检测和新增表中的字段名

    • 自动检测创建和删除索引

    • 自动转换varchar字段类型到text字段类型

    • 自动警告字段的默认值

    err = engine.Sync2(new(model.Permission), new(model.City), new(model.Admin), new(model.AdminPermission), new(model.User))

    如上是Sync2方法的使用方法

  • 其他设置

    • 是否显示SQL语句(开发调试时使用)

       engine.ShowSQL(true)
    • 设置数据库最大连接数

       engine.SetMaxOpenConns(10)
    • 设置最大空闲连接数量:默认是2

       engine.SetMaxIdleConns(5)

代码:

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql" //不能忘记导入
	"github.com/go-xorm/xorm"
	"github.com/go-xorm/core"
)

func main() {

	//1. 创建数据库引擎对象
	engine, err := xorm.NewEngine("mysql", "root:yu271400@/elmcms?charset=utf8") //elmcms数据库名称
	if err != nil {
		panic(err.Error())
	}

	//2. 数据库引擎关闭
	defer engine.Close()

	//数据库引擎设置
	engine.ShowSQL(true)                     //设置显示SQL语句
	engine.Logger().SetLevel(core.LOG_DEBUG) //设置日志级别
	engine.SetMaxOpenConns(10)               //设置最大连接数
	//engine.SetMaxIdleConns(2) //设置最大空闲连接数
	engine.Sync(new(Person)) //同步到数据库

	//查询表的所有数据
	session := engine.Table("user")
	count, err := session.Count()
	if err != nil {
		panic(err.Error())
	}
	fmt.Println(count)

	//使用原生sql语句进行查询
	result, err := engine.Query("select  * from user")
	if err != nil {
		panic(err.Error())
	}
	for key, value := range result {
		fmt.Println(key, value)
	}
}

type Person struct {
	Age  int
	Name string
}

func OrmMapping() {

}

二、xorm结构体映射规则和表操作

名称映射规则

名称映射规则主要负责结构体名称到表名和结构体field到表字段的名称映射。 在xorm框架中由core.IMapper接口的实现者来管理,xorm内置了三种IMapper实现:core.SnakeMapper,core.SameMappercore.GonicMapper

  • SnakeMapper:支持struct为驼峰式命名,表结构中为下划线命名之间的转换。该种规则为xorm默认的Maper;

  • SameMapper:映射规则支持结构体名称和对应的表名称以及结构体field名称与对应的表字段名称相同的命名;

  • GonicMapper:该映射规则和驼峰式命名类似,但是对于特定词支持性更好,比如ID将会翻译成id,而不是驼峰式的i_d。

默认的名称映射规则为SnakeMapper,如果开发者需要改变时,可以使用创建的数据库引擎对象进行如下设置:

engine.SetMapper(core.SameMapper{} 

另外,可以设置表名和表字段分别为不同的映射规则:

 engine.SetTableMapper(core.SameMapper{})
 engine.SetColumnMapper(core.SnakeMapper{})

使用Tag的映射规则

如果所有的命名都是按照IMapper的映射来操作的,那当然是最理想的。但是如果碰到某个表名或者某个字段名跟映射规则不匹配时,我们就需要别的机制来改变。 xorm提供了如下几种方式来进行:

  • 如果结构体拥有TableName() string的成员方法,那么此方法的返回值即是该结构体对应的数据库表名。

  • 通过engine.Table()方法可以改变struct对应的数据库表的名称,通过sturct中field对应的Tag中使用xorm:"\'column_name\'"可以使该field对应的Column名称为指定名称。这里使用两个单引号将Column名称括起来是为了防止名称冲突,因为我们在Tag中还可以对这个Column进行更多的定义。如果名称不冲突的情况,单引号也可以不使用。

Column属性定义

我们在field对应的Tag中对Column的一些属性进行定义,用于对我们的项目中的数据库表字段进行设置和限定。定义的方法基本和我们写SQL定义表结构类似。如下所示:

 type User struct {
     Id   int64
     Name string  `xorm:"varchar(25) notnull unique \'usr_name\'"`
 }

xorm中对数据类型有自己的定义,具体的Tag规则如下,另Tag中的关键字均不区分大小写:

name 当前field对应的字段的名称
pk 是否是Primary Key
name 当前field对应的字段的名称
pk 是否是Primary Key
autoincr 是否是自增
[not ]null 或 notnull 是否可以为空
unique 是否是唯一
index 是否是索引

| extends | 应用于一个匿名成员结构体或者非匿名成员结构体之上 | - | 这个Field将不进行字段映射 | | -> | Field将只写入到数据库而不从数据库读取 | | <- | Field将只从数据库读取,而不写入到数据库 | | created | Field将在Insert时自动赋值为当前时间 | | updated | Field将在Insert或Update时自动赋值为当前时间 | |deleted | Field将在Delete时设置为当前时间,并且当前记录不删除 | | version | Field将会在insert时默认为1,每次更新自动加1 | | default 0或default(0) | 设置默认值,紧跟的内容如果是Varchar等需要加上单引号 | | json | 表示内容将先转成Json格式 |

字段映射规则

除了上述表名的映射规则和使用Tag对字段进行设置以外,基础的Go语言结构体数据类型也会对应到数据库表中的字段中,具体的一些数据类型对应规则如下:

Go语言数据类型 xorm 中的类型
implemented Conversion Text
int, int8, int16, int32, uint, uint8, uint16, uint32 Int
int64, uint64 BigInt
float32 Float
float64 Double
complex64, complex128 Varchar(64)
[]uint8 Blob
array, slice, map except []uint8 Text
bool Bool
string Varchar(255)
time.Time DateTime
cascade struct BigInt
struct Text
Others Text

表基本操作

  • 创建表:CreateTables(),参数为一个或多个空的对应Struct的指针。

  • 判断表是否为空:IsTableEmpty()

  • 判断表是否存在:IsTableExist()

  • 删除表:DropTables(),参数为一个或多个空的对应Struct的指针或者表的名字。

基本和统计操作

查询和统计主要使用Get, Find, Count, Rows, Iterate这几个方法,以及条件查询Where。

package main

import (
	_ "github.com/go-sql-driver/mysql" //不能忘记导入
	"github.com/go-xorm/xorm"
	"fmt"
	"github.com/go-xorm/core"
)

func main() {
	//1. 创建数据库引擎对象
	engine, err := xorm.NewEngine("mysql", "root:yu271400@/testCms?charset=utf8")
	if err != nil {
		panic(err.Error())
	}

	//设置名称映射规则
	//engine.SetMapper(core.SnakeMapper{}) //驼峰式命名,变成表名字段后是_分割
	//engine.Sync2(new(UserTable))

	//engine.SetMapper(core.SameMapper{}) //表名和字段和结构体的一模一样
	//engine.Sync2(new(StudentTable))

	engine.SetMapper(core.GonicMapper{})
	engine.Sync2(new(PersonTable))

	personEmpty, err := engine.IsTableEmpty(new(PersonTable))
	if err != nil {
		panic(err.Error())
	}
	if personEmpty {
		fmt.Println(" 人员表是空的 ")
	} else {
		fmt.Println(" 人员表不为空 ")
	}

	//判断表结构是否存在
	studentExist, err := engine.IsTableExist(new(StudentTable))
	if err != nil {
		panic(err.Error())
	}
	if studentExist {
		fmt.Println("学生表存在")
	} else {
		fmt.Println("学生表不存在")
	}
}

//用户表
type UserTable struct {
	UserId   int64  `xorm:"pk autoincr"`
	UserName string `xorm:"varchar(32)"` //用户名
	UserAge  int64  `xorm:"default 1"`   //用户年龄
	UserSex  int64  `xorm:"default 0"`   //用户性别
}

//学生表
type StudentTable struct {
	Id          int64  `xorm:"pk autoincr"` //主键 自增
	StudentName string `xorm:"varchar(24)"`
	StudentAge  int    `xorm:"int default 0"`
	StudentSex  int    `xorm:"index"` //sex为索引
}

//人员结构表
type PersonTable struct {
	Id         int64     `xorm:"pk autoincr"`   //主键自增
	PersonName string    `xorm:"varchar(24)"`   //可变字符
	PersonAge  int       `xorm:"int default 0"` //默认值
	PersonSex  int       `xorm:"notnull"`       //不能为空
	City       CityTable `xorm:"-"`             //不映射该字段,数据库中没有City这个字段
}

//城市表
type CityTable struct {
	CityName      string
	CityLongitude float32
	CityLatitude  float32
}

 

分类:

技术点:

相关文章: