zoukankan      html  css  js  c++  java
  • xorm实例-创建xorm,映射

    创建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/

  • 相关阅读:
    Python学习之路:MINST实战第一版
    Python学习之路:NumPy进阶
    Python学习之路:NumPy初识
    Python学习之路:一天搞定基础部分
    7. 整数反转(leetcode)
    1. 两数之和(leetcode)
    172. 阶乘后的零(leetcode)
    Java模拟斗地主发牌(Collections工具类的应用)
    CF刷题-Codeforces Round #481-G. Petya's Exams
    【android】安卓平台版本和API版本的对应关系
  • 原文地址:https://www.cnblogs.com/jiangxiangxiang/p/10922784.html
Copyright © 2011-2022 走看看