咨询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:如果是复合类型(比如自定义行类型),关联到对应表的OIDtypelem:如果是数组类型,关联到元素类型的OIDtypbasetype:如果是派生类型,关联到基础类型的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
相关产品推荐
相关产品推荐

