# go-adm **Repository Path**: lewisliang82/go-adm ## Basic Information - **Project Name**: go-adm - **Description**: ADM - Active Data Model,动态数据模型,Go语言轻量ORM,no heavy, go easy! - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 9 - **Created**: 2015-05-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Go ADM - Active Data Model Go语言ORM,暂时只支持MySQL,本来并不打算做成ORM,不过实在是没办法。 目前封装包含了: 1. [数据库配置 - XmlConfig](http://git.oschina.net/janpoem/go-adm/wikis/adm.Config) 2. [连接器 - Connection](http://git.oschina.net/janpoem/go-adm/wikis/adm.Connection) 3. [查询结果集 - ResultSet, ResultRow, ExecResult](http://git.oschina.net/janpoem/go-adm/wikis/adm.Results) 4. [查询构造器 - QueryBuilder](http://git.oschina.net/janpoem/go-adm/wikis/adm.QueryBuilder) 5. [数据模型和事件 - Model, ModelEvents](http://git.oschina.net/janpoem/go-adm/wikis/adm.Model) 6. [数据模型映射 - ModelMapping](http://git.oschina.net/janpoem/go-adm/wikis/adm.ModelMapping) 已经将对Model的反射集中到ModelMapping中(mapping.go),并且go-agi库的type_conv.go中增加了大量的类型转换的方法(尤其是AnyTo*开头的函数,详情请看:[type_conv.go](http://git.oschina.net/janpoem/go-agi/blob/master/type_conv.go))。 mapping.go定义的是数据模型的反射逻辑。 model.go则是外部对数据模型的操作。 修改后的数据装箱的性能成倍提升了,具体多少就不说了,我比较满意。 目前可用度已达到80%了,除了缓存部分的接口设计以外,不会再增加新的接口和库的规模。 **[2015.05.02]** 重构model.go部分的代码,分离Model的数据操作,和ModelMapping(模型反射)两个区块,代码可控性更强,结构更清晰。 **[2015.05.01]** 初步实现ORM,大量hardcode来实现的反射 **[2015.04.29]** 初步完成数据库查询构造器、数据库配置加载、数据库连接器的功能。 **[2015.04.28]** 本库诞生…… 需要基于[go-agi](http://git.oschina.net/janpoem/go-agi)这个库。 ``` shell go get git.oschina.net/janpoem/go-agi go get git.oschina.net/janpoem/go-adm ``` 详细的使用说明,请查看[Wiki](http://git.oschina.net/janpoem/go-adm/wikis)。 目前已知有一个问题: Model.IsExists()的检查,目前只能检查ResultRow,而没办法结合ExecResult的结果进行综合判断。 这导致的情况就是,如果一条空记录,在创建了记录并保存以后,调用IsExists()的话,仍然会显示为false。不过因为Go在嵌入结构方面也比较灵活,所以一个经典的Model的设计,应该参考以下的代码: ``` go type ClassicModel struct { *adm.ResultRow *adm.ExecResult *adm.ModelEvents } func (this ClassicModel) IsExists() bool { if this.ExecResult != nil { if this.IsDelete() { return false } if this.IsCreate() || this.IsUpdate() { return true } } if this.ResultRow.IsExists() { return true } return false } ``` 不过暂时不打算将这个结构嵌入到类库中,最好根据自己的实际需求来做修正,比如我的某个项目中,对数据库的每个记录会有缓存,所以,实际上我会这样去实现这个ClassicModel: ``` go type ClassicModel struct { *adm.ResultRow *adm.ExecResult *adm.ModelEvents *Cached } func (this ClassicModel) IsExists() bool { if this.ExecResult != nil { if this.IsDelete() { return false } if this.IsCreate() || this.IsUpdate() { return true } } if this.Cached.IsCached() { return true } if this.ResultRow.IsExists() { return true } return false } ```