话不多说直接上地址: https://github.com/swiftcarrot/queryx
一键安装:
curl -sf https://raw.githubusercontent.com/swiftcarrot/queryx/main/install.sh | sh
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 文件和数据库结构。
运行 queryx g
在 db
目录下会生成对应的 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 的版本。我们希望在后续版本中继续提升开发体验。
v0.1.7 添加了 mysql 和 sqlite 支持,只需要修改对应的 adapter:
database "db" {
adapter = "mysql"
config "development" {
url = "root@tcp(localhost:3306)/queryx_test?parseTime=true"
}
}
database "db" {
adapter = "sqlite"
config "test" {
url = "file:test.sqlite3"
}
}
1
Mo3et 2023-07-05 12:28:00 +08:00 1
不错不错 帮顶! 周末研究下
|
2
hooopo 2023-07-05 13:11:21 +08:00 1
cool
|
3
dw2693734d 2023-07-05 15:53:14 +08:00 via iPhone
牛逼, repliacation 可以设置吗
|
4
adjusted OP @dw2693734d 暂时还不支持 replica / cluster ,应该可以通过自定义 adapter 来实现,我们目前主要工作还是在确认 ORM API 的设计。
|
5
dw2693734d 2023-07-05 16:18:48 +08:00 via iPhone 1
@adjusted rails dev 支持一波,这种 migration 很喜欢
|
6
FightPig 2023-07-05 23:38:23 +08:00 1
用 rails 的人大喜
|
7
timnottom 2023-07-06 09:40:45 +08:00
命令行工具名称简洁点啊,比如:qx
弄个 queryx 看着别扭 |
9
waltcow 2023-07-06 11:29:53 +08:00
和 ent 有啥区别
|
10
Mistyrainjn 2023-07-06 11:40:10 +08:00
为啥没有中文文档
|
11
adjusted OP @Mistyrainjn 还在编辑
|
12
adjusted OP @waltcow queryx 没有采用图模型来处理关系,生成的代码相对比较简单(除了 driver 之外没有第三方依赖),最大的区别是 queryx 还会支持其他语言,比如 typescript
|
13
zoharSoul 2023-07-06 16:29:15 +08:00
其实我一直没搞懂, 根据 model 生成数据库这种需求是什么时候会用到...
建表/修改表结构, 不是都要走 sql 上线审批的吗? |
14
adjusted OP @zoharSoul 说一下个人的理解
1. 声明式开发体验更好 2. sql 自动化过程可以加入一些自动检查,生成最佳实践的 sql 3. 生成的 migration sql 上线前还是可以走人工检查,不矛盾 |
16
hxtheone 2023-07-06 18:45:23 +08:00 via iPhone
帮顶,但说实话作为前 rails dev ,从没用过 activerecord 的 migration ,都是直接怼 sql …
|
18
adjusted OP @hxtheone 我也不喜欢写 migration ,所以默认自动生成 migration sql ,减少心智负担
|
19
dw2693734d 2023-07-07 13:52:16 +08:00
@hxtheone 那多人协作是不是挺麻烦的
|
20
adjusted OP @dw2693734d 都提交到 git 里面,问题应该不大
|
21
THESDZ 2023-07-12 08:45:56 +08:00
|
23
THESDZ 2023-07-13 08:58:20 +08:00
@adjusted #22 schema 并非单一真相,大多数的程序对接的存储介质并非一个,而程序却可以唯一(微服务场景下,每个服务原子化了),我倾向于,schema 做为底层,由程序自动化控制,在上线之后的生命周期中,不应该接触到 schema,而只能接触到程序,所以文档,图表均应该通过程序生成,而非 schema(schema 可以做为一个数据的来源,但不能做为直接源和单一源)
|
25
songray 2023-07-14 13:08:47 +08:00
想必是参加 ruby conf 2023 的那个老哥?
|
26
wangritian 2023-07-28 00:24:42 +08:00
我是通过 go struct 上写注解生成创建/修改表结构的 sql 语句的,服务启动时由选举出的 leader 执行,用了几年了,很爽
添加表、添加字段、修改字段默认执行,删除字段、删除表仅打印提示,我再手动执行 |
27
adjusted OP @wangritian 是的,手写 migration sql 心智负担太大了
|
28
gemini 2023-08-05 12:33:23 +08:00
看上去有点像 prisma… 先收藏
|
29
adjusted OP @gemini queryx 用的原生 driver ,生成的代码比较简单,我们都是直接 checkin 到 git
|
30
vmlinz 2023-08-22 20:10:04 +08:00 via iPhone
最近刚好看 golang orm
目前看了 gorm ,sqlc migration 管理的话用 go-migrate ,还有一个 altlas ,也是用 hcl 定义 schema 。 |
31
vmlinz 2023-08-22 20:21:44 +08:00 via iPhone
|