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

2023-07-05 12:22:46 +08:00
 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 的版本。我们希望在后续版本中继续提升开发体验。

7244 次点击
所在节点    分享创造
32 条回复
Mo3et
2023-07-05 12:28:00 +08:00
不错不错 帮顶! 周末研究下
hooopo
2023-07-05 13:11:21 +08:00
cool
dw2693734d
2023-07-05 15:53:14 +08:00
牛逼, repliacation 可以设置吗
adjusted
2023-07-05 16:04:37 +08:00
@dw2693734d 暂时还不支持 replica / cluster ,应该可以通过自定义 adapter 来实现,我们目前主要工作还是在确认 ORM API 的设计。
dw2693734d
2023-07-05 16:18:48 +08:00
@adjusted rails dev 支持一波,这种 migration 很喜欢
FightPig
2023-07-05 23:38:23 +08:00
用 rails 的人大喜
timnottom
2023-07-06 09:40:45 +08:00
命令行工具名称简洁点啊,比如:qx

弄个 queryx 看着别扭
adjusted
2023-07-06 09:55:42 +08:00
@timnottom 有道理,可以考虑!
waltcow
2023-07-06 11:29:53 +08:00
和 ent 有啥区别
Mistyrainjn
2023-07-06 11:40:10 +08:00
为啥没有中文文档
adjusted
2023-07-06 11:59:15 +08:00
@Mistyrainjn 还在编辑
adjusted
2023-07-06 12:00:50 +08:00
@waltcow queryx 没有采用图模型来处理关系,生成的代码相对比较简单(除了 driver 之外没有第三方依赖),最大的区别是 queryx 还会支持其他语言,比如 typescript
zoharSoul
2023-07-06 16:29:15 +08:00
其实我一直没搞懂, 根据 model 生成数据库这种需求是什么时候会用到...
建表/修改表结构, 不是都要走 sql 上线审批的吗?
adjusted
2023-07-06 17:39:21 +08:00
@zoharSoul 说一下个人的理解
1. 声明式开发体验更好
2. sql 自动化过程可以加入一些自动检查,生成最佳实践的 sql
3. 生成的 migration sql 上线前还是可以走人工检查,不矛盾
zoharSoul
2023-07-06 18:35:32 +08:00
@adjusted #14
我说的不是 1,2 这种查询的
单纯指自动建表, 自动建库
hxtheone
2023-07-06 18:45:23 +08:00
帮顶,但说实话作为前 rails dev ,从没用过 activerecord 的 migration ,都是直接怼 sql …
adjusted
2023-07-06 19:26:36 +08:00
@zoharSoul 是指建表和修改表格的 sql
adjusted
2023-07-06 19:27:36 +08:00
@hxtheone 我也不喜欢写 migration ,所以默认自动生成 migration sql ,减少心智负担
dw2693734d
2023-07-07 13:52:16 +08:00
@hxtheone 那多人协作是不是挺麻烦的
adjusted
2023-07-07 21:43:56 +08:00
@dw2693734d 都提交到 git 里面,问题应该不大

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

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

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

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

© 2021 V2EX