Queryx: 开源一个支持数据库自动管理的 Go ORM

320 天前
 adjusted

话不多说直接上地址: https://github.com/swiftcarrot/queryx

一键安装:

curl -sf https://raw.githubusercontent.com/swiftcarrot/queryx/main/install.sh  | sh

schema.hcl

Queryx 使用 schema.hcl 来描述数据库,在以下例子中定义了数据库环境以及数据库模型。

database "db" {
  adapter = "postgresql"

  config "development" {
    url = "postgres://postgres:postgres@localhost:5432/blog_development?sslmode=disable"
  }

  config "production" {
    url = env("DATABASE_URL")
  }

  generator "client-golang" {}

  model "Post" {
    column "title" {
      type = string
    }
    column "content" {
      type = text
    }
  }
}

运行 queryx db:create 命令创建 postgres 数据库,然后运行 queryx db:migrate,就可以自动创建对应的 migration 文件和数据库结构。

CRUD

运行 queryx gdb 目录下会生成对应的 ORM 代码, 生成的代码根据数据库生成对应的 Go 类型。生成的代码除了 driver 之外没有其他第三方依赖,我们也希望自动生成的代码简洁可读。

下面是一些 CRUD 操作的示例代码:

// 创建
newPost := c.ChangePost().SetTitle("post title")
post, err := c.QueryPost().Create(newPost)

// 查询
post, err := c.QueryPost().Find(1)
posts, err := c.QueryPost().Where(c.PostTitle.EQ("post title")).All()

// 更新
updatePost := c.ChangePost().SetTitle("new post title")
err := post.Update(updatePost)
updated, err := c.QueryPost().Where(c.PostTitle.EQ("post title")).UpdateAll(updatePost)

// 删除
err := post.Delete()
deleted, err := c.QueryPost().Where(c.PostTitle.EQ("post title")).DeleteAll()

关系

schema.hcl 也可以声明各个 model 之间的关系,包括 belongs_to, has_one, has_many,例如:

model "User" {
  belongs_to "group" {}

  column "name" {
    type = string
  }
}

model "Group" {
  has_many "users" {}

  column "name" {
    type = string
  }
}

声明关系之后,你可以使用生成的 preload方法来避免 n+1 查询,比如:

users, err := c.QueryUser().PreloadGroup().All()
// users[0].Groups

groups, err := c.QueryGroup().PreloadUsers().All()
// groups[0].User

如果你熟悉 Rails ,就会发现 Queryx 参考了很多 ActiveRecord 的设计,我们希望能够复制 ActiveRecord 的开发体验。更多操作请参阅 README 文档,并欢迎在 issue, discussion 以及回复中交流。Queryx 目前仍处于测试阶段,许多功能仍在开发中,比如 TypeScript 的版本。我们希望在后续版本中继续提升开发体验。

6873 次点击
所在节点    分享创造
32 条回复
THESDZ
313 天前
@zoharSoul #13
1.微服务导致数据库变多,sql 也就变多.
2.ci/cd 自动化(最起码开发环境下),数据库也是发版内容,也期望自动化.
3.团队合作,人员参差不齐,人员变动等,可能导致数据库版本的管理与服务版本混乱.

所以:
1.数据库版本控制自动化和标准化势在必行(起码是个趋势)

ps: 个人认为 model 只是一种对于数据库版本的表达而已.👀
adjusted
313 天前
@THESDZ schema 作为"单一真相来源",之后也可以用来生成文档和图表
THESDZ
312 天前
@adjusted #22 schema 并非单一真相,大多数的程序对接的存储介质并非一个,而程序却可以唯一(微服务场景下,每个服务原子化了),我倾向于,schema 做为底层,由程序自动化控制,在上线之后的生命周期中,不应该接触到 schema,而只能接触到程序,所以文档,图表均应该通过程序生成,而非 schema(schema 可以做为一个数据的来源,但不能做为直接源和单一源)
adjusted
311 天前
@THESDZ schema 也可以支持多个数据源
songray
311 天前
想必是参加 ruby conf 2023 的那个老哥?
wangritian
298 天前
我是通过 go struct 上写注解生成创建/修改表结构的 sql 语句的,服务启动时由选举出的 leader 执行,用了几年了,很爽
添加表、添加字段、修改字段默认执行,删除字段、删除表仅打印提示,我再手动执行
adjusted
297 天前
@wangritian 是的,手写 migration sql 心智负担太大了
gemini
289 天前
看上去有点像 prisma… 先收藏
adjusted
289 天前
@gemini queryx 用的原生 driver ,生成的代码比较简单,我们都是直接 checkin 到 git
vmlinz
272 天前
最近刚好看 golang orm

目前看了 gorm ,sqlc

migration 管理的话用 go-migrate ,还有一个 altlas ,也是用 hcl 定义 schema 。
vmlinz
272 天前
adjusted
272 天前
@vmlinz queryx 的自动 migration 是基于 atlas (readme 中有提到),我们也和 atlas 团队一直有沟通。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/954252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX