Skip to content

获取字段类型 ​

本文档主要介绍如何通过 Java 调用获取数据库字段类型的方法,以及该方法的实现原理和使用 PostgreSQL 获取表结构信息的完整流程。

示例代码说明 ​

以下示例代码展示了如何调用 ApiTable.getFieldType 方法获取 website_page_params 表中 page_cost 字段的类型。代码中首先加载环境变量,并通过 TioAdminDbConfiguration 进行数据库配置。随后调用 ApiTable.getFieldType 方法获取字段类型,并将结果输出到控制台。

java
package nexus.io.website.service;

import org.junit.Test;
import nexus.io.table.services.ApiTable;
import nexus.io.tio.boot.admin.config.TioAdminDbConfiguration;
import nexus.io.tio.utils.environment.EnvUtils;

public class ApiTableServiceTest {

  @Test
  public void getType() {
    EnvUtils.load();
    new TioAdminDbConfiguration().config();
    String type = ApiTable.getFieldType("website_page_params", "page_cost");
    System.out.println(type);
  }
}

输出结果:

numeric

从输出结果可以看出,website_page_params 表中的 page_cost 字段类型为 numeric。


运行原理 ​

该方法的核心原理是基于 PostgreSQL 提供的 information_schema.columns 视图来查询指定表的列信息。下面详细介绍查询脚本的组成部分及其作用。

PostgreSQL ​

查询脚本 ​

以下 SQL 脚本用于获取 website_page_params 表的所有列信息,并附带字段类型、是否允许为空、默认值以及主键标记等信息:

sql
SELECT
    column_name AS Field,
    data_type AS Type,
    is_nullable AS Null,
    column_default AS Default,
    CASE
        WHEN column_name = ANY (
            ARRAY(
                SELECT kcu.column_name
                FROM information_schema.key_column_usage AS kcu
                JOIN information_schema.table_constraints AS tc
                  ON kcu.constraint_name = tc.constraint_name
                WHERE tc.table_name = 'website_page_params'
                  AND tc.constraint_type = 'PRIMARY KEY'
            )
        ) THEN 'PRI'
        ELSE ''
    END AS key
FROM information_schema.columns
WHERE table_name = 'website_page_params'
  AND table_schema = 'public';
1. 数据来源 ​
  • 该脚本基于 PostgreSQL 的 information_schema.columns 视图,查询数据库中 website_page_params 表的所有列信息。
  • 除了字段名称和类型,还查询了字段是否允许 NULL、字段默认值以及是否为主键的信息。
2. 关键点解析 ​
  • 字段别名设置:

    • column_name 通过 AS Field 别名展示。
    • data_type 通过 AS Type 别名展示。
    • is_nullable 显示字段是否允许 NULL。
    • column_default 显示字段的默认值。
  • 主键判断:

    • 通过子查询获取表中所有主键字段,并利用 CASE WHEN 结构判断当前字段是否为主键。如果是主键,则标记为 'PRI',否则为空字符串。
3. 应用场景 ​
  • 自动化生成数据字典:通过该查询可以自动化地生成数据库的详细结构说明,方便文档编写和系统维护。
  • 快速查看表结构:在运维或开发过程中,快速查看表中各字段的类型及约束条件,有助于问题定位和功能开发。

表结构示例 ​

以 website_page_params 表为例,查询结果包含以下字段及属性:

FieldTypeNullDefaultKey
idbigintNO(null)PRI
page_namecharacter varyingYES(null)
page_costnumericYES(null)
release_statussmallintYES(null)
create_timetimestamp with time zoneYESCURRENT_TIMESTAMP
update_timetimestamp with time zoneYESCURRENT_TIMESTAMP
statusintegerYES(null)
creatercharacter varyingYES(null)
updatercharacter varyingYES(null)
deletedsmallintYES(null)
tenant_idbigintNO(null)

说明:

  • “(null)” 表示该字段在数据库层面没有显式的默认值。
  • “YES” / “NO” 表示该字段是否允许为 NULL。
  • “PRI” 表示该字段为主键。
  • 实际数据库中可能会因为数据定义语言(DDL)的不同而存在差异,请以实际环境为准。

总结 ​

本文档详细介绍了如何通过 Java 代码获取 PostgreSQL 数据库中指定字段的类型,同时阐述了其实现原理。通过使用 information_schema.columns 视图和联合查询信息获取主键信息的方式,可以自动化生成数据库字段的详细说明文档,为开发和运维工作提供了便利。

希望本文档能帮助大家更好地理解和使用该功能。

MIT Licensed