Используя Python, я пытаюсь запросить в БД список существующих разделов (дочерних таблиц) данной таблицы. Код, который я нашел для этого, сначала создает представление show_partitions:
CREATE OR REPLACE VIEW show_partitions AS
SELECT nmsp_parent.nspname AS parent_schema,
parent.relname AS parent,
nmsp_child.nspname AS child_schema,
child.relname AS child
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relname='my_parent_table';
select * from show_partitions;
Используя py-postgresql, я в настоящее время использую .execute для создания представления, а затем использую .prepare для запроса нового представления для таблиц.
Проблема в том, что время от времени команда .execute зависает. это, кажется, потому что это создает LOCK в БД.
Если я вручную использую:
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'my_database'
AND state = 'active'
чтобы убить команду, а затем повторно запустить мой исходный код, .execute часто оказывается успешным.
Кто-нибудь может объяснить, ПОЧЕМУ это происходит, и каково правильное решение этого?
Есть ли способ использовать .execute для создания представления, но явно НЕ создавать блокировки?
Есть ли лучший способ получить список дочерних таблиц, который позволяет избежать создания представления?
Заранее спасибо.