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

xorm实例-创建xorm,映射的更多相关文章

  1. 如何修改Docker已运行实例的端口映射

    如何修改Docker已运行实例的端口映射 Docker的端口映射,往往出现在两个阶段需要处理: 1.是在docker启动前就已经确定好,哪个docker实例映射哪个端口(往往这个情况比较,需要提前做规 ...

  2. 使用ZwMapViewOfSection创建内存映射文件总结

    标 题: [原创]使用ZwMapViewOfSection创建内存映射文件总结 作 者: 小覃 时 间: 2012-06-15,02:28:36 链 接: http://bbs.pediy.com/s ...

  3. [Java] 实例创建的步骤

    创建类的一个实例时,按照下面步骤进行创建: 1. 给当前类及其父.祖类的所有成员字段分配空间,并给它们赋予默认值 2. 开始执行当前类的构造器 3. 如果当前类有父类,则对父类创建一个实例:从第 2 ...

  4. DB2数据库实例创建与删除 学习笔记

    以root身份执行 $DB2HOME/instance/db2idrop -f 实例名,注意一定要加-f,否则不会删除实例下面sqllib文件.如果不幸忘了,执行db2icrt,会报sqllib文件存 ...

  5. HTML <img>标签 创建图像映射

    初级前端一枚 下面代码是在图片上创建图像映射 自己整理了下 做个笔记 希望也可以帮助后来学习的朋友! <map name="planetmap"> <area s ...

  6. Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)

    Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...

  7. C 语言实例 - 创建各类三角形图案

    C 语言实例 - 创建各类三角形图案 创建三角形图案. 实例 - 使用 * 号 #include <stdio.h> int main() { int i, j, rows; printf ...

  8. hibernate课程 初探单表映射1-9 创建关系映射文件

    创建关系映射文件:(把实体类映射成一个表) 1 右键src==>new==>other==>hibernate==>hbm.xml==>Student==>Fini ...

  9. Django——6 模型基础ORM 数据库连接配置 模型的创建与映射 数据的增删改查

    Django Django的ORM简介 数据库连接配置 模型的创建与映射 数据库的增删改查 增数据 查数据及补充 改数据 删数据   Django的ORM系统分析 ORM概念:对象关系映射(Objec ...

随机推荐

  1. 使用singer tap-postgres 同步数据到pg

    singer 是一个很不错的开源etl 解决方案,以下演示一个简单的数据从pg 同步到pg 很简单就是使用tap-postgres + target-postgres 环境准备 对于测试的环境的数据库 ...

  2. 产品生命周期(Product Life Circle,PLC)

    什么是产品生命周期? 产品生命周期是新产品从开发进入市场到被市场淘汰的整个过程.产品生命周期可分为初创期.成长期.成熟期.衰退期. 产品生命周期有什么用? 在产品不同的生命阶段,公司的业务目的都不同. ...

  3. 50、Spark Streaming实时wordcount程序开发

    一.java版本 package cn.spark.study.streaming; import java.util.Arrays; import org.apache.spark.SparkCon ...

  4. 微信小程序轮播组件

    在index.wxml中添加以下代码 <view> <swiper indicator-dots="{{indicatorDots}}" autoplay=&qu ...

  5. python实现:判断某一天是那一年中的第几天

    方法1:先判断是否是闰年,然后再利用求和,得出某一天是第几天 # 方法1:low版 def func1(year, month, day): # 分别创建平年,闰年的月份天数列表(注意列表下标从0开始 ...

  6. Android中百分比布局

    百分比布局的出现主要是因为LinearLayout中可以通过android:layout_weight="1"这种方法来支持按比例指定控件大小 但是FrameLayout和Rela ...

  7. el-table里面的列需要对比两个返回参数

    需求是这样的--- 已发布时间超过30分钟,显示黄色,超过一个钟显示红色 现在后台返回的时间的格式是2018-10-22 11:23:23的格式 做法是: 第一步: 先将后台返回的格式转化为时间戳,然 ...

  8. vue data不可以使用箭头函数的问题解析

    这篇文章主要介绍了vue data不可以使用箭头函数问题,本文通过源码解析给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 首先需要明确,a() {}和 b: () => {} ...

  9. 20189220 余超《Linux内核原理与分析》第六周作业

    系统调用的三层机制 实验过程 1.克隆MenuOS rm menu -rf //强制删除当前menu git clone http://git.shiyanlou.com/mengning/menu. ...

  10. Servlet使用反射机制

    传统servlet存在的问题 每一个不同的请求都要写Servlet,导致整个项目servlet过多,不易维护 解决方案 同一个模块只写一个Servlet,然后每一个请求传一个参数,后台根据参数取调用不 ...