当前位置: 首页 > news >正文

使用xorm工具,根据数据库自动生成 go 代码

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

使用xorm工具,根据数据库自动生成 go 代码

引入

使用 golang 操作数据库的同学都会遇到一个问题 —— 根据数据表结构创建对应的 struct 模型。因为 golang 的使用首字母控制可见范围,我们经常要设计 struct 字段名和数据库字段名的对应关系。久而久之,这是一个非常繁琐的过程。事情变得繁琐了,我们都会想,有没有好的办法自动生成 model 呢?今天,记录一种自动生成代码的方法 —— xorm 工具。

关于 xorm

xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。我在项目中经常使用,它的特性如下:

  • 支持Struct和数据库表之间的灵活映射,并支持自动同步表结构
  • 事务支持
  • 支持原始SQL语句和ORM操作的混合执行
  • 使用连写来简化调用
  • 支持使用Id, In, Where, Limit, Join, Having, Table, Sql, Cols等函数和结构体等方式作为条件
  • 支持级联加载Struct
  • 支持LRU缓存(支持memory, memcache, leveldb, redis缓存Store) 和 Redis缓存
  • 支持反转,即根据数据库自动生成xorm的结构体
  • 支持事件
  • 支持created, updated, deleted和version记录版本(即乐观锁)

 

想了解更多请移步:http://www.xorm.io/

xorm 工具

xorm 是一组数据库操作命令的工具,包含如下命令:

  • reverse 反转一个数据库结构,生成代码
  • shell 通用的数据库操作客户端,可对数据库结构和数据操作
  • dump Dump数据库中所有结构和数据到标准输出
  • source 从标注输入中执行SQL文件
  • driver 列出所有支持的数据库驱动

那我们该如何使用 reverse 命令根据数据表结构生成 go 代码呢?

首先我们要下载该工具 :

go get github.com/go-xorm/cmd/xorm

同时需要安装对应的 driver :

go get github.com/go-sql-driver/mysql  //MyMysql
go get github.com/ziutek/mymysql/godrv  //MyMysql
go get github.com/lib/pq  //Postgres
go get github.com/mattn/go-sqlite3  //SQLite

还需要下载 xorm :

go get github.com/go-xorm/xorm

编译 cmd/xorm 会生成 xorm 工具, 假如环境变量。

cd到安装路径 
1.cd G:\go_workspace\GOPATH\src\github.com\go-xorm\cmd\xorm 
2.go build 
3.go build //这样就生成了xorm.exe

3.xorm reverse postgres “dbname=test sslmode=disable user=postgres password=123” templates/goxorm

执行完毕,会在当前路径cd G:\go_workspace\GOPATH\src\github.com\go-xorm\cmd\xorm下的model文件夹里 
出现test数据库中,所有表的go model 
这里写图片描述 
user.go

package model

import (
    "time"
)

type User struct {
    Id      int       `xorm:"not null pk autoincr INTEGER"`
    Name    string    `xorm:"VARCHAR(20)"`
    Created time.Time `xorm:"default 'now()' DATETIME"`
    ClassId int       `xorm:"default 1 INTEGER"`
}
  •  

class.go

package model

type Class struct {
    Id   int    `xorm:"not null pk autoincr INTEGER"`
    Name string `xorm:"VARCHAR(20)"`
}

 

这时候,执行 xorm help reverse 能获取帮助信息如下:

usage: xorm reverse [-s] driverName datasourceName tmplPath [generatedPath] [tableFilterReg]

according database's tables and columns to generate codes for Go, C++ and etc.

    -s                Generated one go file for every table
    driverName        Database driver name, now supported four: mysql mymysql sqlite3 postgres
    datasourceName    Database connection uri, for detail infomation please visit driver's project page
    tmplPath          Template dir for generated. the default templates dir has provide 1 template
    generatedPath     This parameter is optional, if blank, the default value is model, then will
                      generated all codes in model dir
    tableFilterReg    Table name filter regexp

可以知道,执行参数 -s 表示为每张表创建一个单独文件。接下来的参数依次是:驱动,数据源,模板目录(在源码的 /cmd/xorm/templates/goxorm 可根据需求定制),生成目录,表格过滤条件。

接下来我们以 Mysql 为例介绍使用方法。

xorm reverse mysql name:password@(ip:port)/xxx?charset=utf8 /cmd/xorm/templates/goxorm

这里输出目录参数省略,会在当前目录建立一个 model 目录,该目录下就是自动生成的 go 代码,, 驼峰命名方式。具体内容如下:

package model

type TestModel struct {
    Id            int    `json:"id" xorm:"not null pk autoincr INT(11)"`
    VpsName       string `json:"vps_name" xorm:"VARCHAR(30)"`
    VpsIp         string `json:"vps_ip" xorm:"CHAR(15)"`
    VpsPrivateIp  string `json:"vps_private_ip" xorm:"CHAR(50)"`
    VpsCpu        int    `json:"vps_cpu" xorm:"INT(11)"`
    VpsMem        int    `json:"vps_mem" xorm:"INT(11)"`
    VpsDisk       int    `json:"vps_disk" xorm:"INT(11)"`
    VpsStatus     string `json:"vps_status" xorm:"VARCHAR(255)"`
    LastHeartTime int    `json:"last_heart_time" xorm:"INT(11)"`
    CreateTime    int    `json:"create_time" xorm:"INT(11)"`                                                       LastTime      int    `json:"last_time" xorm:"INT(11)"`
}

到这里,就生成了我们想要的 model , 免去了手写的繁琐过程。

转载于:https://my.oschina.net/u/3626804/blog/2967310

相关文章:

  • 服务端渲染(SSR)
  • 2019互联网校招薪资表: BAT、华为还没有TMD高
  • 使用java执行ffmpeg命令进行推流操作
  • vim利用vundle安装YouCompleteMe
  • 高性能负载均衡之分类架构
  • 华为关于多层网络可视化的研究
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • docker-consul
  • 天猫amp;PEPCO 超智能新零售智慧门店横空出世
  • 思否第一天
  • git学习(一)
  • 图与网络优化---图的基本概念
  • 微服务:更愉快还是更嘈杂?
  • Internet Download Manager IDM 破解器
  • 确保web安全的HTTPS
  • Google 是如何开发 Web 框架的
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【css3】浏览器内核及其兼容性
  • 2017年终总结、随想
  • create-react-app做的留言板
  • js ES6 求数组的交集,并集,还有差集
  • k8s如何管理Pod
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React-生命周期杂记
  • spring + angular 实现导出excel
  • springboot_database项目介绍
  • 安装python包到指定虚拟环境
  • 对超线程几个不同角度的解释
  • 给第三方使用接口的 URL 签名实现
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 一文看透浏览器架构
  • 原生js练习题---第五课
  • 整理一些计算机基础知识!
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #define
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)SpringCloud 整合Python
  • (day6) 319. 灯泡开关
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (循环依赖问题)学习spring的第九天
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CLR基本术语
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET和.COM和.CN域名区别
  • .NET中两种OCR方式对比
  • .vue文件怎么使用_vue调试工具vue-devtools的安装