解决xorm逆向工程问题

Posted chenjianhui254

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决xorm逆向工程问题相关的知识,希望对你有一定的参考价值。

解决xorm逆向工程问题

问题

xorm : 无法将“xorm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

今天在用xorm做逆向工程的时候碰到了一个普遍问题,xorm : 无法将“xorm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

在尝试网上的两种方法后得不到解决,且旧版xorm有类型不兼容的问题,故选择用新版xorm。

新版xorm逆向工程过程

go get xorm.io/reverse

reverse包下执行下列命令:

go build -buildmode=exe

生成reverse.exe

将该.exe文件放置到长期执行的目录下,并创建配置文件custom.yml

#custom.yml文件
kind: reverse
name: users
source:
  database: mysql
  conn_str: \'你的地址\' #要换地址
targets:
  - type: codes
    language: golang
    output_dir: ./testoutput

执行下列命令

reverse -f custom.yml

默认在当前目录下生成testoutput文件夹,在文件夹中生成models.go文件,即所得。

golang xorm应用

github.com/go-xorm/xorm  xorm库

http://www.xorm.io/docs/  手册

xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。

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

var engine *xorm.Engine

在使用前,记得导入需要的包

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

创建完成engine之后,并没有立即连接数据库,此时可以通过engine.Ping()来进行数据库的连接测试是否可以连接到数据库。另外对于某些数据库有连接超时设置的,可以通过起一个定期Ping的Go程来保持连接鲜活。

 engine可以通过engine.Close来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。

如果是go-sql-driver,执行exec()也会自动关闭,但是执行Query()则需要关闭。

日志

xorm的日志比使用go-sql-driver要好用,总体来说xorm是现有的orm中值得一用的一个。

日志是一个接口,通过设置日志,可以显示SQL,警告以及错误等,默认的显示级别为INFO。

  • engine.ShowSQL(true),则会在控制台打印出生成的SQL语句;
  • engine.Logger().SetLevel(core.LOG_DEBUG),则会在控制台打印调试及以上的信息;

如果希望将信息不仅打印到控制台,而是保存为文件,那么可以通过类似如下的代码实现,NewSimpleLogger(w io.Writer)接收一个io.Writer接口来将数据写入到对应的设施中。

当然,如果希望将日志记录到syslog中,也可以如下:

logWriter, err := syslog.New(syslog.LOG_DEBUG, "rest-xorm-example")
if err != nil {
	log.Fatalf("Fail to create xorm system logger: %v\n", err)
}

logger := xorm.NewSimpleLogger(logWriter)
logger.ShowSQL(true)
engine.SetLogger(logger)

连接池

engine内部支持连接池接口和对应的函数。

ps:go-sql-driver 内部也支持连接池。

  • 如果需要设置连接池的空闲数大小,可以使用engine.SetMaxIdleConns()来实现。
  • 如果需要设置最大打开连接数,则可以使用engine.SetMaxOpenConns()来实现。

最后,举一个xorm的使用例子

 

var users []User
err := engine.Where("name = ?", name).And("age > 10").Limit(10, 0).Find(&users)
// SELECT * FROM user WHERE name = ? AND age > 10 limit 0 offset 10

type Detail struct {
    Id int64
    UserId int64 `xorm:"index"`
}

type UserDetail struct {
    User `xorm:"extends"`
    Detail `xorm:"extends"`
}

var users []UserDetail
err := engine.Table("user").Select("user.*, detail.*")
    Join("INNER", "detail", "detail.user_id = user.id").
    Where("user.name = ?", name).Limit(10, 0).
    Find(&users)
// SELECT user.*, detail.* FROM user INNER JOIN detail WHERE user.name = ? limit 0 offset 10

 

以上是关于解决xorm逆向工程问题的主要内容,如果未能解决你的问题,请参考以下文章

解决XORM的时区问题

xorm 条件查询时区的问题

golang xorm应用

go iris xorm包使用(sqlite3数据库增删查改)

Go数据库操作插件-xorm

数据库开发总结:sql语句创建+XORM