内容提要
Postgres 19 新增了随机日期/时间函数,支持指定范围并保持类型一致,简化了测试数据生成。同时引入三个新函数(pg_get_role_ddl、pg_get_tablespace_ddl、pg_get_database_ddl),可直接获取角色、表空间和数据库的DDL定义,无需依赖外部工具如pg_dumpall,提升了数据库管理的便捷性。
延伸解读
随机日期函数:告别类型转换的烦恼
Postgres 19 新增的 random(start, end) 函数支持日期、时间戳等类型,返回类型与输入一致,避免了以往通过日期加间隔生成随机日期时产生的隐式类型提升(如 DATE 变成 TIMESTAMP)。这简化了测试数据的生成,也减少了因类型不一致导致的潜在错误。
DDL 获取函数:减少对外部工具的依赖
pg_get_role_ddl、pg_get_tablespace_ddl 和 pg_get_database_ddl 三个新函数允许直接通过 SQL 查询获取全局对象的 DDL 定义,无需再依赖 pg_dumpall 或 GUI 工具。这提升了数据库管理的便捷性,尤其对于需要自动化脚本或快速查看对象定义的场景,但需注意这些函数目前仅覆盖全局对象,且不会泄露密码等敏感信息。
可复现的随机数据:setseed 的妙用
结合 setseed() 函数,可以生成可复现的随机数据,这对于测试和调试非常重要。通过设置种子值,每次运行相同的查询都会得到相同的结果,从而避免因随机数据导致的不稳定测试。配合 generate_series(),可以轻松生成大量确定性的样本数据,用于负载测试或数据填充。
Q&A
Postgres 19 新增的随机日期/时间函数有什么特点?
Postgres 19 新增了 random() 函数的重载,可以接受显式的上下界,支持 date、timestamp、timestamptz 等类型,返回类型与输入类型一致,避免了之前需要额外转换的问题。
如何在 Postgres 19 中生成指定范围内的随机日期?
使用 random(start, end) 函数,例如 random('2026-01-01'::date, '2026-12-31') 会返回一个在指定范围内的随机日期,且返回类型为 date。
Postgres 19 中如何生成可重复的随机数据?
使用 setseed() 函数设置随机种子,然后调用 random() 函数,在同一个会话中会生成相同的随机序列。例如:SELECT setseed(0.42); SELECT random(1, 100);
Postgres 19 新增了哪些 DDL 信息函数?它们有什么用途?
新增了 pg_get_role_ddl()、pg_get_tablespace_ddl() 和 pg_get_database_ddl() 三个函数,分别用于获取角色、表空间和数据库的 DDL 定义,无需依赖 pg_dumpall 等外部工具。
如何使用 pg_get_role_ddl() 获取角色的定义?
直接调用 pg_get_role_ddl('角色名') 即可,例如 SELECT pg_get_role_ddl('app_ro'); 会返回创建该角色的完整 DDL 语句,包括属性、设置和成员关系。
pg_get_role_ddl() 函数是否包含密码信息?为什么?
不包含密码信息,这是为了避免泄露敏感信息。密码哈希仍然可以通过 pg_dumpall 获取,但用户可调用的函数不会返回。
pg_get_tablespace_ddl() 函数相比传统查询有什么优势?
传统查询需要连接 pg_tablespace 和 pg_roles 视图,并使用 pg_tablespace_location() 函数,而新函数直接返回完整的 DDL 语句,包括位置和存储参数,更简洁高效。
pg_get_database_ddl() 函数支持哪些选项?
支持 'owner'、'tablespace'、'pretty' 等选项,可以控制是否包含 OWNER 子句、TABLESPACE 子句,以及是否使用美化格式输出。