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

310 天前
 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 的版本。我们希望在后续版本中继续提升开发体验。

6851 次点击
所在节点    分享创造
32 条回复
Mo3et
310 天前
不错不错 帮顶! 周末研究下
hooopo
310 天前
cool
dw2693734d
310 天前
牛逼, repliacation 可以设置吗
adjusted
310 天前
@dw2693734d 暂时还不支持 replica / cluster ,应该可以通过自定义 adapter 来实现,我们目前主要工作还是在确认 ORM API 的设计。
dw2693734d
310 天前
@adjusted rails dev 支持一波,这种 migration 很喜欢
FightPig
309 天前
用 rails 的人大喜
timnottom
309 天前
命令行工具名称简洁点啊,比如:qx

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

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

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

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

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

© 2021 V2EX