扩展元数据释义
Module:
每个扩展都有一些元数据属性,以下是这些属性的说明
id
扩展标识,由 Pigsty 唯一分配给每个扩展的整型标识符,用于内部排序。
name
扩展名,扩展在 PostgreSQL 扩展系统目录中的名称,用于 CREATE EXTESION
时引用。
扩展一般会带有同名的 <name>.control
, <name>*.so
,以及 <name>*.sql
文件。
alias
扩展别名,由 Pigsty 为每个逻辑扩展分配的唯一名称,通常与 扩展名 name
保持一致。
但存在一些特例,比如安装一个扩展 RPM 包如果引入多个 Extension,那么这些 Extension 会共享一个别名,例如 postgis
version
扩展默认版本,通常是扩展的最新版本。通常由定义于扩展 control
文件中的版本号决定。
在一些特殊情况下,RPM 与 Debian 中可用的扩展版本可能略微有所不同。
category
扩展分类,用于区分扩展的功能类型,默认分为16大类: gis
,time
,rag
,fts
,olap
,feat
,lang
,type
,util
, func
,admin
,stat
,sec
,fdw
,sim
,etl
等。
tags
一些标签,用于描述扩展的特性
repo
扩展的来源仓库,CONTRIB
代表这是一个 PostgreSQL 自带扩展,PGDG
代表这是一个 PGDG 第一方扩展,PIGSTY
代表这是一个 Pigsty 第三方扩展。
lang
扩展使用的编程语言,通常为 C
,也有一些 C++
或 Rust
编写的扩展。也有纯 SQL 与纯数据组成的扩展。
need_load
带有 Load
标记,意味着这个扩展使用了 PostgreSQL Hook,需要动态加载,并重启 PostgreSQL 生效。
只有少量扩展需要动态加载,大部分扩展都是静态加载的。
need_ddl
带有 DDL
标记,意味着这个扩展需要执行 DDL 语句:CREATE EXTENSION
。
绝大多数扩展都需要执行 CREATE EXTENSION
DDL 语句完成创建,但也有一些特例,例如 pg_stat_statements
,wal2json
等。
need_dbsu
安装此扩展是否需要超级用户权限?或者说,这个扩展是否被“信任” —— 只在数据库内部提供功能。
少部分扩展因为只在数据库内部提供功能,因此不需要超级用户权限就能安装,任何持有 CREATE
权限的用户都可以安装受信任的扩展。
relocatable
扩展是否可以被重定位?即是否可以被安装到其他 Schema 中?大部分扩展都是可以被重定位的,但也有一些特例,这些扩展会显式指定自己使用的扩展名。
schemas
如果扩展是可重定位的,那么它可以被安装到指定的 Schema 中,这个属性指定了扩展的默认 Schema。
PostgreSQL 默认只允许扩展使用一个 Schema,但一些扩展并不遵循这个规则,例如 citus
与 timescaledb
等。
pg_ver
扩展支持的 PostgreSQL 版本,默认只考虑支持声明周期内的版本,即 12 - 16 。
requires
此扩展依赖的其他扩展,如果有的话。一个扩展可能同时依赖多个其他扩展,这些依赖关系通常在扩展的 control
文件中的 requires
字段里声明。
安装扩展时,可以通过 CREATE EXTENSION xxx CASCADE
语句自动安装依赖的扩展。
pkg
扩展软件包(RPM/DEB)名称,这里使用 $v
来替代具体的 PostgreSQL 大版本号。
pkg_ver
扩展软件包(RPM/DEB)的版本号,通常 RPM / DEB 包的版本与扩展本身的版本(version,从系统视图中得到)是一致的。 但依然存在极个别特例,软件包的版本与扩展本身的版本是不一致,甚至是独立演进管理的。
pkg_deps
扩展软件包(RPM/DEB)的依赖,不同于扩展本身的依赖(requires
),这里是扩展 RPM/DEB 包的特殊依赖。
url
扩展的官方网站或者源代码仓库地址。
license
扩展使用的开源许可证,通常是 PostgreSQL
,MIT
,Apache
,GPL
等。
en_desc
扩展的英文描述,用于描述扩展的功能与用途。
zh_desc
扩展的中文描述,用于描述扩展的功能与用途。
comment
一些额外的注释,用于描述扩展的特性或者注意事项。
数据库模式
CREATE TABLE IF NOT EXISTS ext.extension
(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
pkg TEXT NOT NULL,
alias TEXT,
category TEXT,
state TEXT,
url TEXT,
license TEXT,
tags TEXT[],
version TEXT,
repo TEXT,
lang TEXT,
contrib BOOLEAN,
lead BOOLEAN,
has_bin BOOLEAN,
has_lib BOOLEAN,
need_ddl BOOLEAN,
need_load BOOLEAN,
trusted BOOLEAN,
relocatable BOOLEAN,
schemas TEXT[],
pg_ver TEXT[],
requires TEXT[],
rpm_ver TEXT,
rpm_repo TEXT,
rpm_pkg TEXT,
rpm_pg TEXT[],
rpm_deps TEXT[],
deb_ver TEXT,
deb_repo TEXT,
deb_pkg TEXT,
deb_deps TEXT[],
deb_pg TEXT[],
bad_case TEXT[],
extra JSONB,
ctime DATE DEFAULT CURRENT_DATE,
mtime DATE DEFAULT CURRENT_DATE,
en_desc TEXT,
zh_desc TEXT,
comment TEXT
);
COMMENT ON TABLE ext.extension IS 'PostgreSQL Extension Table';
COMMENT ON COLUMN ext.extension.id IS 'Extension Identifier (integer)';
COMMENT ON COLUMN ext.extension.name IS 'Extension Name (in system catalog)';
COMMENT ON COLUMN ext.extension.pkg IS 'Normalized extension package name';
COMMENT ON COLUMN ext.extension.alias IS 'Download pkg group alias';
COMMENT ON COLUMN ext.extension.category IS 'Category of this extension';
COMMENT ON COLUMN ext.extension.state IS 'Extension State (available, deprecated, removed, not-ready)';
COMMENT ON COLUMN ext.extension.url IS 'Extension Repo URL';
COMMENT ON COLUMN ext.extension.license IS 'Extension License';
COMMENT ON COLUMN ext.extension.tags IS 'Extra tags';
COMMENT ON COLUMN ext.extension.version IS 'the latest available version of this extension';
COMMENT ON COLUMN ext.extension.lang IS 'Programming Language of this extension';
COMMENT ON COLUMN ext.extension.lead IS 'Mark the primary extension among one multi-ext package';
COMMENT ON COLUMN ext.extension.has_bin IS 'does this extension has binary utils';
COMMENT ON COLUMN ext.extension.has_lib IS 'Does the extension have shared library?';
COMMENT ON COLUMN ext.extension.need_ddl IS 'Extension need `CREATE EXTENSION` to work?';
COMMENT ON COLUMN ext.extension.need_load IS 'Require LOAD & shared_preload_libraries to work?';
COMMENT ON COLUMN ext.extension.trusted IS 'A Trusted extension does not require superuser to work';
COMMENT ON COLUMN ext.extension.relocatable IS 'Can this extension be relocated?';
COMMENT ON COLUMN ext.extension.schemas IS 'Installed Schema, if not relocatable';
COMMENT ON COLUMN ext.extension.pg_ver IS 'Supported PostgreSQL major versions';
COMMENT ON COLUMN ext.extension.requires IS 'Dependencies of this extension';
COMMENT ON COLUMN ext.extension.rpm_pkg IS 'RPM package name, major version is replace with $v';
COMMENT ON COLUMN ext.extension.deb_pkg IS 'DEB package name, major version is replace with $v';
COMMENT ON COLUMN ext.extension.en_desc IS 'English description';
COMMENT ON COLUMN ext.extension.zh_desc IS 'Chinese description';
COMMENT ON COLUMN ext.extension.comment IS 'Extra information';