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

咨询sqlx自动执行的两条PostgreSQL系统SQL查询语句的用途

SQLx自动执行的PostgreSQL系统查询用途解析

这两条都是SQLx为实现数据库类型与Go类型自动映射、结构体字段与表字段绑定发起的元数据查询,具体用途如下:

第一条查询(查询pg_type表)

这条语句从PostgreSQL系统表pg_catalog.pg_type中,根据传入的类型OID($1参数)获取对应数据库类型的详细元数据:

  • typname:类型名称(比如int4、jsonb)
  • typtype:类型类别(比如b代表基础类型,c代表复合类型)
  • typcategory:类型分类(比如N代表数值型,S代表字符串型)
  • typrelid:如果是复合类型(比如自定义行类型),关联到对应表的OID
  • typelem:如果是数组类型,关联到元素类型的OID
  • typbasetype:如果是派生类型,关联到基础类型的OID

SQLx用这些信息精准映射PostgreSQL类型到Go语言类型——比如把数据库的uuid类型转成Go的uuid.UUID,把jsonb转成map[string]interface{}或自定义结构体,确保类型转换的正确性。

对应的SQL语句:

SELECT
  typname,
  typtype,
  typcategory,
  typrelid,
  typelem,
  typbasetype
FROM
  pg_catalog.pg_type
WHERE
  oid = $1

第二条查询(查询pg_attribute表)

这条语句从PostgreSQL系统表pg_catalog.pg_attribute中,根据传入的表OID($1参数)获取该表的有效字段信息:

  • NOT attisdropped排除已被删除的字段
  • attnum > 0排除系统隐藏字段(比如ctid、xmin这类内部字段)
  • 按attnum排序保证字段顺序和表定义一致

SQLx用这些信息建立Go结构体与数据库表字段的绑定关系——比如你用sqlx.Get把查询结果赋值给结构体时,它会匹配结构体字段名(或db标签)和表的attname,同时结合字段的atttypid(类型OID)调用第一条查询获取类型信息,完成数据的正确赋值。

对应的SQL语句:

SELECT
  attname,
  atttypid
FROM
  pg_catalog.pg_attribute
WHERE
  attrelid = $1
  AND NOT attisdropped
  AND attnum > 0
ORDER BY
  attnum

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:30:29