Вот часть моего текущего кода:
Код: Выделить всё
cursor.execute("""
SELECT relname, CASE relkind
WHEN 'r' THEN 'Table'
WHEN 'v' THEN 'View'
WHEN 'f' THEN 'Foreign Table'
WHEN 'm' THEN 'Materialized View'
WHEN 'p' THEN 'Partitioned Table'
ELSE 'Unknown'
END AS object_type
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = %s AND c.relname = %s;
""", (schema_name, object_name))
object_type = cursor.fetchone()
if object_type is None:
object_type = 'Unknown'
else:
object_type = object_type[1]
if object_type == 'Unknown':
sql = f"SELECT routine_name " \
f"FROM information_schema.routines " \
f"WHERE specific_schema = %s AND routine_name = %s"
cursor.execute(sql, (schema_name, object_name))
routine_exists = cursor.fetchone()
if routine_exists:
object_type = 'PROCEDURE/FUNCTION'
Есть ли более простой способ определить тип объекта базы данных PostgreSQL напрямую или с помощью более эффективного одиночного запроса, возможно, путем объединения таблиц, вместо моего текущего подхода?
Как определить, является ли объект базы данных пакетом в PostgreSQL?
Я попробовал следующее:
Текущий подход: я использовал несколько запросы и условия для определения типа объекта:
Я проверил таблицы pg_class и pg_namespace, чтобы определить, является ли это таблицей или представлением.
Если тип объекта был «Неизвестный», я запросил таблицу information_schema.routines, чтобы узнать, является ли это функцией или процедурой.
Мне нужен совет по оптимизации процесса идентификации типа объекта и любые идеи по распознаванию пакетов, если возможно.