登录
首页 >  Golang >  Go问答

用 Golang、PostgreSQL 和 sqlc 构建具有嵌套数据的系统

来源:stackoverflow

时间:2024-02-07 22:24:22 256浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《用 Golang、PostgreSQL 和 sqlc 构建具有嵌套数据的系统》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我在 golang 项目中使用 sqlc 和 postgresql 数据库。我的数据库具有以下简化架构:

create table users (
  username varchar(255) primary key,
  email varchar(255) unique not null
);

create table flats (
  id serial primary key,
  name varchar(255) not null
);

create table user_flats (
  id serial primary key,
  username varchar(255) not null references users(username),
  flat_id integer not null references flats(id)
);

我需要检索带有给定平面 id 的关联用户数组的平面详细信息,打算返回如下 go 结构:

type flatdetails struct {
    flatid   int32
    flatname string
    users    []user
}

但是,当使用 sql 查询连接 flatsuser_flatsusers 表时,sqlc 会生成一个没有嵌套 user 切片的 go 结构,将每个用户字段视为单独的字段。这是一个连接示例

SELECT 
  f.id AS flat_id,
  f.name AS flat_name,
  u.username,
  u.email
FROM
  flats f
JOIN 
  user_flats uf ON f.id = uf.flat_id
JOIN 
  users u ON uf.username = u.username
WHERE 
  f.id = $1;

虽然当前的方法通过手动将字段映射到 go 结构来工作,但随着更复杂的连接和更大的表,它变得非常复杂和低效。是否有更有效或更惯用的方法来使用 sqlc 处理这种情况,我可以将查询结果直接映射到具有嵌套切片或数组的结构?任何指示或建议都将受到高度赞赏!


正确答案


如果有人仍在寻求答案,您应该使用sqlc.embed

例如

-- name: GetFlatWithUsers :many
SELECT 
  sqlc.embed(f),
  sqlc.embed(u)
FROM
  flats f
JOIN 
  user_flats uf ON f.id = uf.flat_id
JOIN 
  users u ON uf.username = u.username
WHERE 
  f.id = $1;

以上就是《用 Golang、PostgreSQL 和 sqlc 构建具有嵌套数据的系统》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>