You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Go、sqlc开发API时PostgreSQL查询结果显示异常求助

解决PostgreSQL表字段查询API返回异常问题

问题描述

我开发了一个获取PostgreSQL表所有字段的API,在pgAdmin4中查询information_schema.columns表能得到正常结果,但用Go、sqlc和chi-router开发的API,Postman返回结果异常(类似加密状态)。期望返回格式如下:

[
  {
    "TableName": "tablec",
    "ColumnName": "firstname"
  },
  {
    "TableName": "tablec",
    "ColumnName": "lastname"
  }
]

原因分析

查看sqlc生成的代码,核心问题如下:

  • GetTableDetailRow结构体的TableName和ColumnName字段被定义为interface{}类型,而非实际的string类型
  • Go的JSON序列化器处理interface{}类型时,若底层类型未明确,会导致序列化结果异常(如显示为非预期编码格式)
  • 生成的GetTableDetail函数参数为interface{},与传入的string类型不匹配,引发隐式类型转换问题

修复步骤

1. 配置sqlc识别PostgreSQL类型

创建或修改sqlc.yaml配置文件,明确指定PostgreSQL方言,让sqlc正确推断字段类型:

version: "2"
sql:
  - queries: "information_schema.columns.sql"
    engine: "postgresql"
    gen:
      go:
        package: "database"
        out: "database"

2. 重新生成sqlc代码

执行sqlc生成命令,更新数据库交互代码:

sqlc generate

重新生成后,代码会自动修正类型:

type GetTableDetailRow struct {
    TableName  string
    ColumnName string
}

func (q *Queries) GetTableDetail(ctx context.Context, tableName string) ([]GetTableDetailRow, error) {
    // ... 自动生成的正确查询逻辑
}

3. 确保响应头正确设置

检查respondWithJSON函数,确保它设置了正确的Content-Type响应头,让Postman能正确解析JSON:

func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(code)
    if err := json.NewEncoder(w).Encode(payload); err != nil {
        respondWithError(w, 500, "Failed to serialize response")
    }
}

最终效果

重新启动API后,Postman将返回与pgAdmin4一致的正常JSON结果,格式与预期完全匹配。

内容的提问来源于stack exchange,提问作者cyber_g

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:49:51