Для начала: вы можете получить нужную информацию непосредственно из information_schema.tables
, а не information_schema.columns
(в таблице всего одна строка, поэтому требуется distinct
).
Затем: в Postgres, вы можете делать все, что хотите, в одном запросе, используя каскадные общие табличные выражения с предложением returning
до insert
операторов в Postgres. can
Logi c - это сначала вставлять верхние объекты (базы данных) и возвращать сгенерированные сериалы, затем вставлять схемы (используя сериалы базы данных) и, наконец, таблицы.
with
info as (
select c.table_catalog, c.table_schema, c.table_name
from information_schema.tables
where
c.table_schema not in ('information_schema', 'pg_catalog', 'pg_internal')
and c.table_schema not like '% %'
),
dbs as (
insert into resources (type, name)
select distinct 'database', table_catalog
from info
returning id, name
),
schemas as (
insert into resources(type, name, parent)
select distinct 'schema', i.table_schema, d.id
from info i
inner join dbs d on d.name = i.table_catalog
returning id, name, parent
)
insert into resources(type, name, parent)
select 'table', table_name, s.id
from info i
inner join schemas s on s.name = i.table_schema
inner join dbs d on d.id = s.parent and d.name = i.table_catalog
Обратите внимание, что последний insert
присоединяется как к schemas
, так и к dbs
; это предназначено для правильной обработки "одноименных" таблиц, которые живут в разных схемах.
Здесь - это демонстрация (я использовал таблицу для отображения c результатов вашего первоначального запроса).