欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

xorm实例-创建xorm,映射

程序员文章站 2022-04-28 14:14:04
创建xorm引擎 go //在xorm里面,可以同时存在多个Orm引擎,一个Orm引擎称为Engine, //一个Engine一般只对应一个数据库。 //Engine通过调用 生成,如: package main import ( "fmt" _ "github.com/go sql driver/ ......

创建xorm引擎

//在xorm里面,可以同时存在多个orm引擎,一个orm引擎称为engine,
//一个engine一般只对应一个数据库。
//engine通过调用`xorm.newengine`生成,如:

package main

import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/xorm"
"log"
)

func main() {
    var err error
/*[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramn=valuen]*/
//一般情况下如果只操作一个数据库,只需要创建一个engine即可。engine是goroutine安全的。

engine, err = xorm.newengine("mysql", "root:123456@/test")
    if err != nil {
        log.fatal(err)
        return
    }
    
    //创建完成engine之后,并没有立即连接数据库
//此时可以通过engine.ping()来进行数据库的连接测试是否可以连接到数据库。 
    err = engine.ping()
    if err != nil{
        log.fatal(err)
        return
    }
//[xorm] [info]  2019/05/25 13:50:04.228243 ping database mysql

名称映射规则

  • 职责

    结构体名称---------------------------表名

    结构体field---------------------------表字段的名称

  • 由core.imapper接口的实现者来管理,xorm内置了三种imapper实现

    • core.snakemapper

      支持struct为驼峰式命名,表结构为下划线命名之间的转换

    • core.samemapper

      支持结构体名称和对应的表名称以及结构体field名称与对应的表字段名称相同的命名

    • core.gonicmapper

      snakemapper很类似,但是对于特定词支持更好,比如id会翻译成id而不是i_d。

  • 当前snakemapper为默认值,如果需要改变时,在engine创建完成后使用

    engine.setmapper(core.samemapper{})
  • 如果你使用了别的命名规则映射方案,也可以自己实现一个imapper。

    表名称和字段名称的映射规则默认是相同的,当然也可以设置为不同,如:

    engine.settablemapper(core.samemapper{})
    engine.setcolumnmapper(core.snakemapper{})

前缀映射,后缀映射

package main

import (
    _ "github.com/go-sql-driver/mysql"
    "github.com/go-xorm/core"
    "github.com/go-xorm/xorm"
    "log"
)

var engine *xorm.engine

type user struct {
    id int `xorm:"id"`
    name string `xorm:"name"`
    age int  `xorm:"age"`
}


type user1 struct {
    id int `xorm:"id"`
    name string `xorm:"name"`
    age int  `xorm:"age"`
}



func main() {
    var err error
    engine, err = xorm.newengine("mysql", "root:123456@/test")
    if err != nil {
        log.fatal(err)
        return
    }

    /*通过 `core.newprefixmapper(core.snakemapper{}, "prefix")`
    可以创建一个在snakemapper的基础上在命名中添加统一的前缀,
    也可以把snakemapper{}换成samemapper或者你自定义的mapper。*/

//例如,如果希望所有的表名都在结构体自动命名的基础上加一个前缀而字段名不加前缀
//则可以在engine创建完成后执行以下语句(只针对新建的表,不能改变之前建立的表的前缀):
    tbmapper := core.newprefixmapper(core.snakemapper{}, "prefix_")
    engine.settablemapper(tbmapper)

//执行之后,结构体 `type user struct` 默认对应的表名就变成了 `prefix_user` 了
//而之前默认的是 `user`
    err = engine.createtables(user{})
    if err != nil {
        log.fatal(err)
        return
    }


/*  通过 `core.newsufffixmapper(core.snakemapper{}, "suffix")` 
    可以创建一个在snakemapper的基础上在命名中添加统一的后缀,
    当然也可以把snakemapper换成samemapper或者你自定义的mapper。*/
    tmapper := core.newsuffixmapper(core.snakemapper{}, "_suffix")
    engine.settablemapper(tmapper)

    err = engine.createtables(user1{})
    if err != nil {
        log.fatal(err)
        return
    }
}

参考:http://gobook.io/read/github.com/go-xorm/manual-zh-cn/