Postgresql Go-SQLBoiler:查询关系并返回

Postgresql Go-SQLBoiler:查询关系并返回,postgresql,go,graphql,protocol-buffers,grpc,Postgresql,Go,Graphql,Protocol Buffers,Grpc,我正在使用SQLBoiler,如何查询关系并返回?我有两个单独的产品及其价格/货币db表。我想查询这两个函数并将它们一起返回到一个列表中,比如getAllrequest 这是初始架构文件 --schema.sql 如果存在产品级联,则删除表; 如果有钱,放下桌子; 创建表格产品( id序列非空主键, 用户id int不为空, 名称varchar(255)不为空, 说明文本不为空, 已在timestamptz处创建_not null default now(), 更新了timestamptz处的_

我正在使用SQLBoiler,如何查询关系并返回?我有两个单独的产品及其价格/货币db表。我想查询这两个函数并将它们一起返回到一个列表中,比如
getAll
request

这是初始架构文件

--schema.sql
如果存在产品级联,则删除表;
如果有钱,放下桌子;
创建表格产品(
id序列非空主键,
用户id int不为空,
名称varchar(255)不为空,
说明文本不为空,
已在timestamptz处创建_not null default now(),
更新了timestamptz处的_not null default now(),
已在时间戳处删除
);
创造台币(
product_id int非空主键,
货币代码文本不为空默认为“USD”,
单位int不为空,
nanos int不为空,
已在timestamptz处创建_not null default now(),
更新了timestamptz处的_not null default now(),
外键(product_id)在删除级联上引用products(id)
);
创建唯一索引idx\u产品\u名称
关于产品(名称);
在产品(用户id、名称、描述)中插入值(1,“某物”、“这是某物”);
在产品(用户id、名称、描述)中插入值(2,“任何东西”、“这就是任何东西”);
插入货币(产品id、货币代码、单位、纳米)值(1,'GBP',450,75);
插入货币(产品id、货币代码、单位、纳米)值(2,'CAD',9,20);
。。。
func(s*Server)索引(context.context,*pb.Empty)(*pb.IndexProductResponse,错误){
db:=InitPg()
延迟db.Close()
//从生成的protobuf生成产品类型的切片
产品:=制造([]*pb.Product,0)
//获得所有产品(无价格)
ps,err:=models.Products().All(context.Background(),db)
LogAndReport(&pb.IndexProductResponse{},err)
//如何从货币表中查询每个产品的价格?
//或
//如何查询所有资金并分配给每个相关产品?
//fmt.Println(“@ps here>”,ps)
//将查询到的产品追加到产品切片中进行返回
对于u,p:=范围ps{
产品=附加(产品,
&铅产品{
Id:int32(p.Id),
姓名:p.姓名,
描述:p.描述,
//我需要在这里返回/分配价格信息。
//我可以和戈姆这样做。
//
//价格:&pb.Money{
//货币代码:p.Price.CurrencyCode,
//单位:p.Price.Units,
//Nano:p.Price.Nanos,
// },
UserId:int32(p.UserId),
})
}
return&pb.IndexProductResponse{Products:Products},无
}
...
这是来自创建产品,但在产品列表中几乎与预期的GraphQL结果相同:

{
  "data": {
    "products": [
      {
        "id": "1",
        "name": "Something",
        "description": "This is something.",
        "price": {
          "currencyCode": "USD",
          "units": 9,
          "nanos": 93
        },
        "userId": "1"
      },
      {
        "id": "2",
        "name": "Anything",
        "description": "This is anything.",
        "price": {
          "currencyCode": "USD",
          "units": 24,
          "nanos": 56
        },
        "userId": "1"
      }
    ]
  },
...
}
...
这是产品服务的protobuf文件

服务产品服务{
rpc索引(空)返回(IndexProductResponse){}
}
短信钱{
//ISO 4217中定义的三字母货币代码。
字符串货币_代码=1;
//金额的全部单位。
//例如,如果“currencyCode”是“USD”,那么1个单位就是1美元。
int64单位=2;
//数量的纳米(10^-9)单位数。
//该值必须介于-99999999和+99999999(含)之间。
//如果'units'为正,'nanos'必须为正或零。
//如果'units'为零,'nanos'可以为正、零或负。
//如果'units'是负数,'nanos'必须是负数或零。
//例如,$-1.75表示为“单位”=-1和“纳米”=-750000000。
int32纳米=3;
}
消息产品{
int32id=1;
字符串名称=2;
字符串描述=3;
货币价格=4;
int32用户标识=5;
}
消息IndexProductResponse{
重复产品=1;
}

是否要加载主要对象Product及其所有相关的货币行

这应该做到:

products, err :=
    models.Products(
        qm.Load(models.ProductRels.ProductMoneys)
    ).All(context.Background(), db)
这将生成并执行两个SQL查询。第一个查询应该是

SELECT * FROM "products"
并将检索所有产品。第二个查询应该类似于

SELECT * FROM "money" WHERE ("money"."product_id" IN ($1,$2,$3))
并将检索所有产品的所有资金。(条款中
的确切内容将取决于返回的产品数量。)

然后,您应该能够访问相关行,如下所示:

products[0].R.ProductMoneys

注意:
ProductRels
和/或
ProductMoneys
可能不是SQLBoiler生成的确切名称。我不得不在这里猜测。确保检查生成的代码以获得正确的名称。

是否要加载主要对象Product及其所有相关的货币行

这应该做到:

products, err :=
    models.Products(
        qm.Load(models.ProductRels.ProductMoneys)
    ).All(context.Background(), db)
这将生成并执行两个SQL查询。第一个查询应该是

SELECT * FROM "products"
并将检索所有产品。第二个查询应该类似于

SELECT * FROM "money" WHERE ("money"."product_id" IN ($1,$2,$3))
并将检索所有产品的所有资金。(条款中
的确切内容将取决于返回的产品数量。)

然后,您应该能够访问相关行,如下所示:

products[0].R.ProductMoneys
注意:
ProductRels
和/或
ProductMoneys
可能不是SQLBoiler生成的确切名称。我不得不在这里猜测。确保检查生成的代码以获得正确的名称