powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вытащить функцию штатным методом = pg_restore
5 сообщений из 5, страница 1 из 1
Вытащить функцию штатным методом = pg_restore
    #40089907
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер всем.

Возникла необходимость вытаскивать функции из БД в автоматическом режиме.
Написал Sell скрипт который создаёт резервные копии БД с отсевом по схемам и таблицам (остается только то что нужно мне, а не все подряд)
Код: sql
1.
2.
3.
Создание копии БД:
pg_dump -U postgres -d база_данных_имя -Ft > $BACKUP_DIR/copy_db_ft.tar
.



Затем тот же скрипт, должен вытащить функции по отдельности - каждую в свой файл ( работа с GIT версиями ).
И вот тут полная засада.
Код: sql
1.
2.
3.
Таблицы вытаскиваются без проблем:
pg_restore -Ft $BACKUP_DIR/copy_db_ft.tar -n funktcii --table=t_temp_имп_***** --file=$BACKUP_DIR/db555.sql
.


то есть вытащить таблицу - не проблема.
Я её открываю и внутри все данные нормальные

Но вот вытащить функцию - никак не получается.
Код: sql
1.
2.
3.
4.
Согласно описанию (pg_restore -?) функции вытащить можно:
 -P, --function=ИМЯ(арг-ты)   восстановить заданную функцию
 -P имя-функции(тип-аргумента[, ...]
 --function=имя-функции(тип-аргумента[, ...])



Я делаю так (ну перепробовал уже вариантов 20, чего только не подставлял):
Код: sql
1.
2.
pg_restore -Ft $BACKUP_DIR/copy_db_ft.tar -n funktcii -P f_имп_росн_***_2_0(text[]) --file= $BACKUP_DIR/db777.txt
. 



Один раз даже что то вытащилось (код вытаскивания не помню), но там полная ерунда - какая то служебная информация в 11 строках кода, когда сама функция на 1500 строк кода. Явно вытащилось не то.

При этом в документации к PostgreSQL 13 написано, что название функции должно точно соответствовать названию в list файле.
Вот что я имею:
Код: sql
1.
2.
3.
4.
5.
 
это функция при её редактировании в DBeaver= CREATE OR REPLACE FUNCTION funktcii."f_имп_росн_****_2_0"(in_text_array text[], OUT out_text_array text[])
это как я вижу название название функции в списке функций опять же в DBeaver =  f_имп_росн_****_2_0(_text)
а это то как видит функцию файл (list файл) = 308; 1255 66383 FUNCTION funktcii f_имп_росн_****_2_0(text[]) postgres
.



Вот этот же list файл со списком данных (функций) внутри него:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
;
; Archive created at 2021-08-08 10:17:09 MSK
;     dbname: *****
;     TOC Entries: 339
;     Compression: 0
;     Dump Version: 1.14-0
;     Format: TAR
;     Integer: 4 bytes
;     Offset: 8 bytes
;     Dumped from database version: 13.3 (Debian 13.3-1.pgdg100+1)
;     Dumped by pg_dump version: 13.3 (Debian 13.3-1.pgdg100+1)
;
;
; Selected TOC Entries:
;
305; 1255 65888 FUNCTION funktcii f_имп_росн_****_1_0(text[]) postgres
308; 1255 66383 FUNCTION funktcii f_имп_росн_****_2_0(text[]) postgres
314; 1255 68933 FUNCTION funktcii f_имп_росн_****_2зк2(text[]) postgres
311; 1255 68293 FUNCTION funktcii f_имп_росн_****_2зк3(text[]) postgres
304; 1255 68294 FUNCTION funktcii f_имп_росн_****_2зкi(text[]) postgres
312; 1255 68801 FUNCTION funktcii f_имп_росн_****_2кр2(text[]) postgres
.



Вроде бы как есть план "Б" - пока к нему не приступал.
Код: sql
1.
2.
SELECT pg_get_functiondef('proc_name'::regproc);
.



Но задело за живое - в инструкции написано что можно вытаскивать функции, а на деле - никак.
У кого какие идеи?
.
...
Рейтинг: 0 / 0
Вытащить функцию штатным методом = pg_restore
    #40089923
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

Hm,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
pg_dump -F c -s -f mboguk.dump mboguk 

pg_restore --format=c --schema=index_watch --function='_convert_mask(text)' --file=- mboguk.dump
--
-- PostgreSQL database dump
--

-- Dumped from database version 13.3 (Ubuntu 13.3-1.pgdg20.10+1)
-- Dumped by pg_dump version 13.3 (Ubuntu 13.3-1.pgdg20.10+1)

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: _convert_mask(text); Type: FUNCTION; Schema: index_watch; Owner: mboguk
--

CREATE FUNCTION index_watch._convert_mask(mask text) RETURNS text
    LANGUAGE plpgsql IMMUTABLE STRICT
    AS $_$
BEGIN
mask := regexp_replace(mask, E'\\?', '.', 'g');
mask := regexp_replace(mask, E'\\*', '.*', 'g');
return '^('||mask||')$';
END;
$_$;


ALTER FUNCTION index_watch._convert_mask(mask text) OWNER TO mboguk;

--
-- PostgreSQL database dump complete
--

Всё работает.

У вас вероятные проблемы или с указанием схемы или с указанием аргументов функции при вызове pg_restore.

Я КАТЕГОРИЧЕСКИ НЕ советую использовать в названиях любых обьектов базы что то кроме Latin1 символов.
Попробуйте с функцией с нормальным английским названием.
Гарантии что оно будет работать корректно с русскими именами никто не даст (100% не проверялось никем).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Вытащить функцию штатным методом = pg_restore
    #40089992
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk

Спасибо.
Направление понял.

Сделал в тестовой схеме public функцию test_01()
Если восстанавливать вот так
pg_restore путь/test_db_full.fc -P test_01 --file=путь/db777.txt
то выводит как раз служебную информацию без самой функции.

Если написать вот так
pg_restore путь/test_db_full.fc -P test_01() --file=путь/db777.txt
то пишет:
Код: sql
1.
bash: синтаксическая ошибка рядом с неожиданным маркером «(»



А вот если заключить функцию в ОДИНАРНЫЕ кавычки , то все работает:
Код: sql
1.
pg_restore путь/test_db_full.fc -P 'test_01()' --file=путь/db777.txt


Я же делал без кавычек или с ДВОЙНЫМИ кавычками (как в Python)

В итоге, если название функции заключить в одинарные кавычки - то все получается нормально.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
--
-- PostgreSQL database dump
--

-- Dumped from database version 13.3 (Debian 13.3-1.pgdg100+1)
-- Dumped by pg_dump version 13.3 (Debian 13.3-1.pgdg100+1)

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: test_01(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION public.test_01() RETURNS integer
    LANGUAGE plpgsql
    AS $$
declare
п_число integer;

begin
	-- начало функции
	п_число:=1+1;
		
return п_число ;
END;
$$;


ALTER FUNCTION public.test_01() OWNER TO postgres;

--
-- PostgreSQL database dump complete
--



Но это просто функция (без входных параметров) и название на английском языке.
Попробую все то же самое для моего случая и отпишусь.

.
...
Рейтинг: 0 / 0
Вытащить функцию штатным методом = pg_restore
    #40089995
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем пишу - все получилось. Главное функцию заключать в одинарные кавычки.
Если при этом в параметрах функции указать неверные данные, к примеру вместо (text[]) указать (_text),
то получите вот такое сообщение, как и просто при выводе функции без параметров [без "()"]
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
--
-- PostgreSQL database dump
--

-- Dumped from database version 13.3 (Debian 13.3-1.pgdg100+1)
-- Dumped by pg_dump version 13.3 (Debian 13.3-1.pgdg100+1)

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

--
-- PostgreSQL database dump complete
--


Если же указать название функции в кавычках, типа
Код: sql
1.
pg_restore -Ft путь/full_ft.tar -n funktcii -P 'f_имп_росн_****_2_0(text[])' --file=путь/db888.txt


то получаем реальный код функции с некоторыми добавками, которые не меняются (при работе в GIT версиями они будут оставаться одинаковыми).

И да, русские буквы в названии функции без проблем - работает все как надо.
.
...
Рейтинг: 0 / 0
Вытащить функцию штатным методом = pg_restore
    #40089996
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S.
При работе с таблицами (при вытаскивании их из архива) - я их НЕ заключаю в кавычки.
Возможно там буде как раз злом - если название таблицы заключить в одинарные кавычки.
.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вытащить функцию штатным методом = pg_restore
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]