nav*_*ige 23 postgresql catalogs user-defined-type
我在 PostgreSQL 中创建了一些新的 UDT。但是,现在我有两个问题:
不幸的是,我在 PostgreSQL 文档中找不到任何相关内容。
gsi*_*ems 27
这会让你开始吗?
SELECT n.nspname AS schema,
pg_catalog.format_type ( t.oid, NULL ) AS name,
t.typname AS internal_name,
CASE
WHEN t.typrelid != 0
THEN CAST ( 'tuple' AS pg_catalog.text )
WHEN t.typlen < 0
THEN CAST ( 'var' AS pg_catalog.text )
ELSE CAST ( t.typlen AS pg_catalog.text )
END AS size,
pg_catalog.array_to_string (
ARRAY( SELECT e.enumlabel
FROM pg_catalog.pg_enum e
WHERE e.enumtypid = t.oid
ORDER BY e.oid ), E'\n'
) AS elements,
pg_catalog.obj_description ( t.oid, 'pg_type' ) AS description
FROM pg_catalog.pg_type t
LEFT JOIN pg_catalog.pg_namespace n
ON n.oid = t.typnamespace
WHERE ( t.typrelid = 0
OR ( SELECT c.relkind = 'c'
FROM pg_catalog.pg_class c
WHERE c.oid = t.typrelid
)
)
AND NOT EXISTS
( SELECT 1
FROM pg_catalog.pg_type el
WHERE el.oid = t.typelem
AND el.typarray = t.oid
)
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND pg_catalog.pg_type_is_visible ( t.oid )
ORDER BY 1, 2;
Run Code Online (Sandbox Code Playgroud)
在 psql 中,您可以\set ECHO_HIDDEN on
让 psql 显示用于生成\d...
命令输出的查询。我发现这些查询作为从数据库中挖掘元数据时的起点非常有用。
更新:2019-12-16
对于复合类型,可以使用以下内容确定列元数据:
WITH types AS (
SELECT n.nspname,
pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
CASE
WHEN t.typrelid != 0 THEN CAST ( 'tuple' AS pg_catalog.text )
WHEN t.typlen < 0 THEN CAST ( 'var' AS pg_catalog.text )
ELSE CAST ( t.typlen AS pg_catalog.text )
END AS obj_type,
coalesce ( pg_catalog.obj_description ( t.oid, 'pg_type' ), '' ) AS description
FROM pg_catalog.pg_type t
JOIN pg_catalog.pg_namespace n
ON n.oid = t.typnamespace
WHERE ( t.typrelid = 0
OR ( SELECT c.relkind = 'c'
FROM pg_catalog.pg_class c
WHERE c.oid = t.typrelid ) )
AND NOT EXISTS (
SELECT 1
FROM pg_catalog.pg_type el
WHERE el.oid = t.typelem
AND el.typarray = t.oid )
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
),
cols AS (
SELECT n.nspname::text AS schema_name,
pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
a.attname::text AS column_name,
pg_catalog.format_type ( a.atttypid, a.atttypmod ) AS data_type,
a.attnotnull AS is_required,
a.attnum AS ordinal_position,
pg_catalog.col_description ( a.attrelid, a.attnum ) AS description
FROM pg_catalog.pg_attribute a
JOIN pg_catalog.pg_type t
ON a.attrelid = t.typrelid
JOIN pg_catalog.pg_namespace n
ON ( n.oid = t.typnamespace )
JOIN types
ON ( types.nspname = n.nspname
AND types.obj_name = pg_catalog.format_type ( t.oid, NULL ) )
WHERE a.attnum > 0
AND NOT a.attisdropped
)
SELECT cols.schema_name,
cols.obj_name,
cols.column_name,
cols.data_type,
cols.ordinal_position,
cols.is_required,
coalesce ( cols.description, '' ) AS description
FROM cols
ORDER BY cols.schema_name,
cols.obj_name,
cols.ordinal_position ;
Run Code Online (Sandbox Code Playgroud)
Erw*_*ter 20
默认客户端具有涵盖以下内容的功能:
旧的默认 GUI(最多 Postgres 10)。
确保在对象浏览器中启用了类型:选项 - 浏览器 - 显示。
新的默认 GUI。
确保在对象浏览器中启用了类型:文件 - 首选项 - 浏览器 - 节点。
在左侧,您会看到所选模式中的用户定义类型。(问题一)
该SQL pane
向右具有所选类型的反向工程SQL脚本。(问题二)
其他窗格中的更多详细信息,例如Dependents
等。
标准的交互式控制台。
\dT
获取用户定义类型的列表。\d type_name
获取给定类型的列定义列表。
\d[S+] [ pattern ]
对于匹配模式的每个关系(表、视图、物化视图、索引、序列或外部表)或复合类型,显示所有列、它们的类型、[...]
大胆强调我的。至少从 Postgres 9.1 开始,该命令也适用于复合类型。
和:
\dT[S+] [ pattern ]
列出数据类型。如果指定了模式,则仅列出名称与模式匹配的类型。如果
+
附加到命令名称,则列出每个类型及其内部名称和大小、允许的值(如果它是一种enum
类型)及其关联的权限。默认情况下,只显示用户创建的对象;提供模式或S
修饰符以包含系统对象。
小智 12
尝试执行这段代码:
SELECT
pg_type.typname,
pg_enum.enumlabel
FROM
pg_type
JOIN
pg_enum ON pg_enum.enumtypid = pg_type.oid;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34679 次 |
最近记录: |