queryx:带有自动架构管理的开源golang orm
#postgres #go #orm

github链接: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命令以创建一个PostgreSQL数据库,然后运行queryx db:migrate以自动创建数据库迁移文件和数据库结构。 Queryx的数据库架构管理建立在Atlas上。

克鲁德

运行queryx gdb目录中生成相应的ORM代码。生成的代码基于数据库架构生成GO类型,除lib/pq驱动程序外,没有其他第三方依赖性。我们希望自动生成的代码简洁且可读。

以下是一些用于CRUD操作的示例代码:

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

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

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

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

关系

schema.hcl中也可以声明包括belongs_tohas_onehas_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

如果您熟悉导轨,您会发现queryx引用了ActivereCord的许多设计概念。我们希望复制Activerecord的发展经验。有关更多queryx用法,请参考读书文件文档,并随时在问题中讨论,讨论和答复。 Queryx当前正在Beta(V0)中,许多功能仍在开发中,例如MySQL支持。我们希望继续改善未来版本的发展经验。