前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 xorm 实现多数据库支持坑点总结

使用 xorm 实现多数据库支持坑点总结

作者头像
LinkinStar
发布2022-10-31 12:05:39
1.4K0
发布2022-10-31 12:05:39
举报
文章被收录于专栏:LinkinStar's Blog

如果你想让你的 go 项目支持不同类型的数据库如:MySQL,PostgreSQL,sqlite3… 那么除了使用 orm 框架帮你屏蔽很多 sql 细节外,还有什么坑点呢?最近我正在使用 xorm 做多数据库类型的适配总结了以下问题供参考。

PS: 本人除了对 MySQL 熟悉外,其他数据库仅停留在使用和了解阶段,当前测试仅覆盖 MySQL,PostgreSQL,sqlite3 三种类型

初始化

以往我们进行数据库初始化一般就是导入需要初始化执行的 sql 文件,但由于需要支持多库,则无法使用功能,因为各个数据库结构不同,我们需要使用 xorm 的功能进行初始化操作。

代码语言:javascript
复制
engine, err := xorm.NewEngine(driver, connection)  
if err != nil {  
 return err
}  
  
if err = engine.Ping(); err != nil {  
 return err  
}  
  
err = engine.Sync(tables...)  
if err != nil {  
 return err  
}
代码语言:javascript
复制
tables = []interface{}{  
 &entity.User{},  
 &entity.Goods{},
}

使用 Sync 就可以将我们实体类对象创建为对应的表。

注意点

  • Sync 只会做创建表的操作,对于已有的表结构无法进行修改
  • 实体类必须包含相关字段 tag 标识用于识别为字段名称类型等

字段

代码语言:javascript
复制
type User struct {
	ID        int       `xorm:"not null pk autoincr INT(11) id"`
	CreatedAt time.Time `xorm:"created TIMESTAMP created_at"`
	UpdatedAt time.Time `xorm:"updated TIMESTAMP updated_at"`
	Username  string    `xorm:"not null default '' VARCHAR(50) UNIQUE username"`
	Password  string    `xorm:"not null default '' VARCHAR(100) password"`
	IsAdmin   bool      `xorm:"not null default false BOOL is_admin"`
}

对于字段,只需要根据 xorm 文档中给出的规范,写好对应的 tag 就可以 https://xorm.io/zh/docs/chapter-02/4.columns/

注意点

  • 不同数据库中字段的类型不同,在 tag 中一定要书写 xorm 的类型,而非数据库的类型,比如上述所示中写的是 BOOL 在 MYSQL 中识别为 TINYINT/INT ,在 sqlite3 中为 INTEGER, 在 postgres 中为 BIGSERIAL
  • 特别注意字符串的是否非空,由于 go 中 string 默认为 “”

索引

索引比较简单根据需求写在实体类对应字段中即可:

  • 普通索引写 index,普通联合索引写 index(索引名称)
  • 唯一索引写 unique,联合唯一索引写 unique(索引名称) 让 xorm 帮助我们去创建索引即可

注释

这个是最头疼的问题,当前 xorm 的 comment tag 只支持 MYSQL,并且只要写了,在其他数据库 SYNC 时候会报错,故当前暂时无法支持其他类型的库。

SQL

绝大部分的 SQL 操作由于使用了 xorm,或使用了 builder,大部分都没有问题,目前遇到的问题仅为:

代码语言:javascript
复制
RIGHT and FULL OUTER JOINs are not currently supported

在使用 RIGHT 和 FULL JOIN 操作的时候 sqlite3 是不支持的。

当然由于各个数据库特性不同,一些特殊的函数操作可能有的也不支持,需要具体测试。若要做多类型支持也尽量可以考虑不去使用。

升级

首先 xorm 的 sync 方法不能帮你修改数据库的字段,因为这是一个极其危险的操作,对于数据库升级来说往往意味着原始数据的迁移或者变动。

所以针对不同数据库的升级,往往只能采用写代码的方式进行适配性解决。

gitea 也是支持了多种类型的数据库,它在每次升级都会执行一个 go 升级文件,其中就包含了变更的操作,有时会根据不同类型的数据库做出不同的操作。

其他提醒

sqlite3 需要使用 CGO,故不能使用 CGO_ENABLED=0 进行编译

总结

  1. 初始化各个数据库表现良好,都能按需初始化成功,无需担心
  2. 字段类型和索引基本 xorm 都有良好支持,按照规范来走就没问题
  3. 注释当前只支持 MYSQL,但由于别的数据库执行会报错,故只能全部没有注释
  4. 特殊 SQL 功能如 RIGHT JOIN,部分数据库无法支持
  5. 数据库初始化之后,升级针对数据库的变更,往往只能通过代码实现
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初始化
    • 注意点
    • 字段
      • 注意点
      • 索引
      • 注释
      • SQL
      • 升级
      • 其他提醒
      • 总结
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档