powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Устновка contrib расширений для разных версий одним файлом
15 сообщений из 15, страница 1 из 1
Устновка contrib расширений для разных версий одним файлом
    #38575669
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Господа, есть необходимость одним sql файлом установить в базу расширение, скажем hstore.

Суть в том, что нужно обновить базу при установке deb пакета через dbconfig-common. А этот пакет будет ставиться на системы с разной версией Postgres (8.3, 8.4 и > 9.x)

Как можно на sql собрать что-то типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
если версия == 8.3 тогда
    \i /usr/share/postgres/8.3/contrib/hstore.sql
иначе если версия == 8.4 тогда
    \i /usr/share/postgres/8.4/contrib/hstore.sql
иначе
    create extension "hstore";
все... ;)


Или через sql никак и нужно искать другие пути?
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38575730
daevy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YP977,
не совсем понятно что вы хотите, чтобы процесс установки контрибов выполнялся при apt-get install "ваш deb пакет"? Или вы хотите sql который запускаешь через psql и он определяя версию сам ставит контриб?

для первого варианта можно запилить простецкий shell скрипт типа такого:

#!/usr/bin/env bash

pgVersion=$(dpkg -l |grep -E "^ii.*postgresql-contrib" |awk '{print $3}' |grep -woE '[0-9]\.[0-9]')
[[ -z $pgVersion ]] && { echo "FATAL: can't determine version"; exit 1; }

case $pgVersion in
8.3 ) psql -h 127.0.0.1 -p 5432 -U postgres -c "\i /usr/share/postgres/8.3/contrib/hstore.sql" ;;
8.4 ) psql -h 127.0.0.1 -p 5432 -U postgres -c "\i /usr/share/postgres/8.4/contrib/hstore.sql" ;;
* ) psql -h 127.0.0.1 -p 5432 -U postgres -c "create extension hstore" ;;
esac

для второго можно написать функцию которая принимает на вход версию постгреса, которую можно выдернуть из (select setting from pg_settings where name = 'server_version_num') и на основании значения делает установку соотв. контриба. И обернуть это в sql где будет создаваться эта функция, выполняться и затем дропаться. Ну и вызывать этот sql через psql -f

Вот такой вот полуночный сумбур)))
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38575743
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу именно второго.
Скрипт написать это как два пальца... ;)
Суть в том, что есть установленный софт при установке которого через dbconfig-common создалась база. При изменении версии софта есть возможность выполнить в postgres-e скрипт.
Так вот ума не приложу как его правильно написать...

Сапасибо за
daevyselect setting from pg_settings where name = 'server_version_num'
искал нечто подобное, но не нашел...

Буду отталкиваться от этого
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576021
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал такой скрипт

Код: 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.
CREATE OR REPLACE FUNCTION system.install_extension()
  RETURNS void AS
$BODY$
DECLARE
    cur_version INT; -- Версия сервера

BEGIN

SELECT INTO cur_version setting::int FROM pg_settings WHERE name = 'server_version_num';

-- Для версии 8.3
IF cur_version > 80300 AND cur_version < 80400 THEN
    RAISE NOTICE 'INSTALL EXTENSION FOR VERSION %', cur_version;
    EXECUTE pg_read_file('/usr/share/postgresql/8.3/contrib/hstore.sql', 0, (pg_stat_file('/usr/share/postgresql/8.3/contrib/hstore.sql')).size);
-- Для версии 8.4
ELSEIF cur_version > 80400 AND cur_version < 80500 THEN
    RAISE NOTICE 'INSTALL EXTENSION FOR VERSION %', cur_version;
    EXECUTE pg_read_file('/usr/share/postgresql/8.4/contrib/hstore.sql', 0, (pg_stat_file('/usr/share/postgresql/8.4/contrib/hstore.sql')).size);
ELSEIF cur_version > 90000 THEN
    RAISE NOTICE 'INSTALL EXTENSION FOR VERSION %', cur_version;
    EXECUTE 'CREATE EXTENSION "hstore";';
ELSE
    RAISE NOTICE 'NOT SUPPORTED VERSION SERVER %', cur_version;
END IF;


END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

SELECT system.install_extension();

DROP FUNCTION system.install_extension();



И тут вдруг бермуды :(

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE FUNCTION
ALTER FUNCTION
COMMENT
NOTICE:  INSTALL EXTENSION FOR VERSION 80419
 ERROR:  absolute path not allowed 
КОНТЕКСТ:  PL/pgSQL function "install_extension" line 16 at EXECUTE statement
DROP FUNCTION

Как обойти ограничение функции pg_read_file чтобы прочитать любой файл? Или чем можно воспользоваться еще?
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576024
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через
Код: sql
1.
2.
3.
CREATE TEMP TABLE x (x text);
COPY x from '/path/to/myfile.txt';
mytxt := (SELECT x from x);


Тоже не получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE FUNCTION
ALTER FUNCTION
COMMENT
NOTICE:  INSTALL EXTENSION FOR VERSION 80419
 ERROR:  extra data after last expected column 
КОНТЕКСТ:  COPY x, line 31: "   LEFTARG = hstore,"
SQL statement "COPY x from '/usr/share/postgresql/8.4/contrib/hstore.sql'"
PL/pgSQL function "install_extension" line 21 at SQL statement
DROP FUNCTION

Еще вариант?
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576026
daevy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YP977,

у меня на версии 9.3.3 работает ваша версия скрипта (единственно за неимением схемы system поменял на public)
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576031
daevy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
стормозил, постгрес же не пытается проверить наличие файлов, если не попал в те условия
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576052
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Идея с COPY провалилась потому, что в файле /usr/share/postgresql/8.4/contrib/hstore.sql присутствует символ Tab.

Вот только экранировать его невозможно :(
А так бы, думаю, отработало бы отлично.
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576054
daevy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YP977,

можно попробовать переписать на использование plperlu вместо plpgsql
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576070
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
daevyможно попробовать переписать на использование plperlu вместо plpgsql
Как будет выглядеть процедура?
В perl не силен.
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576715
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По некоторым параметрам использовать plperl/plperlu не хотелось бы.
Хочется бы каким-нибудь более другими методами.

Есть какие-нибудь идеи?
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576757
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YP977, а зачем на SQL это делать? install скрипты deb пишутся на shell.
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576823
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёш,

dbconfig-common работает с sql файлами. И хочу использовать именно его т.к. очень удобно обновлять базы без лишнего головняка.

Что касается моего вопроса, то планирую в ближайший полчаса-час его решить через COPY.
Когда игрался с указанием разных разделителей неправильно посмотрел вывод и подумал, что не получится...
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576883
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итог выглядит так:

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
CREATE OR REPLACE FUNCTION system.install_extension()
  RETURNS void AS
$BODY$
DECLARE
  cur_version INT; -- Версия сервера
  row_text TEXT;
  file_content TEXT;
  cursor_get_text_row CURSOR FOR
    SELECT row_string FROM text_table;

BEGIN

SELECT INTO cur_version setting::int FROM pg_settings WHERE name = 'server_version_num';

-- Для версии 8.3
IF cur_version > 80300 AND cur_version < 80400 THEN
  RAISE NOTICE 'INSTALL EXTENSION FOR VERSION %', cur_version;
  CREATE TEMP TABLE text_table (row_string text);
  COPY text_table (row_string) from '/usr/share/postgresql/8.3/contrib/hstore.sql' DELIMITER '[';

  file_content := '';
  OPEN cursor_get_text_row;
  LOOP
    FETCH cursor_get_text_row INTO row_text;
    EXIT WHEN NOT FOUND;
    file_content := file_content || row_text || E'\n';
  END LOOP;
  CLOSE cursor_get_text_row;

  EXECUTE file_content;

-- Для версии 8.4
ELSEIF cur_version > 80400 AND cur_version < 80500 THEN
  RAISE NOTICE 'INSTALL EXTENSION FOR VERSION %', cur_version;
  CREATE TEMP TABLE text_table (row_string text);
  COPY text_table (row_string) from '/usr/share/postgresql/8.4/contrib/hstore.sql' DELIMITER '[';

  file_content := '';
  OPEN cursor_get_text_row;
  LOOP
    FETCH cursor_get_text_row INTO row_text;
    EXIT WHEN NOT FOUND;
    file_content := file_content || row_text || E'\n';
  END LOOP;
  CLOSE cursor_get_text_row;

  EXECUTE file_content;

ELSEIF cur_version > 90000 THEN
    RAISE NOTICE 'INSTALL EXTENSION FOR VERSION %', cur_version;
    EXECUTE 'CREATE EXTENSION "hstore";';
ELSE
    RAISE NOTICE 'NOT SUPPORTED VERSION SERVER %', cur_version;
END IF;


END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

SELECT system.install_extension();

DROP FUNCTION system.install_extension();




Понятно, что не очень красиво и не 100% универсально (у разных файлов может быть разный разделитель) но в целом работает так как мне нужно.
...
Рейтинг: 0 / 0
Устновка contrib расширений для разных версий одним файлом
    #38576906
YP977
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот более красивый вариант

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
CREATE OR REPLACE FUNCTION system.install_extensions()
  RETURNS void AS
$BODY$
DECLARE
  cur_version INT; -- Версия сервера
  row_text_hstore TEXT;
  file_content_hstore TEXT;
  cursor_get_text_row_hstore CURSOR FOR
    SELECT row_string FROM text_table_hstore;

BEGIN

SELECT INTO cur_version setting::int FROM pg_settings WHERE name = 'server_version_num';

-- Для версии 8.x
IF cur_version > 80300 AND cur_version < 80500 THEN
  RAISE NOTICE 'INSTALL EXTENSION FOR VERSION %', cur_version;
  
  CREATE TEMP TABLE text_table_hstore (row_string text);
  
  -- Для версии 8.3
  IF cur_version > 80300 AND cur_version < 80400 THEN
    COPY text_table_hstore (row_string) from '/usr/share/postgresql/8.3/contrib/hstore.sql' DELIMITER '[';
  END IF;
  
  -- Для версии 8.4
  IF cur_version > 80400 AND cur_version < 80500 THEN
    COPY text_table_hstore (row_string) from '/usr/share/postgresql/8.4/contrib/hstore.sql' DELIMITER '[';
  END IF;

  file_content_hstore := '';
  OPEN cursor_get_text_row_hstore;
  LOOP
    FETCH cursor_get_text_row_hstore INTO row_text_hstore;
    EXIT WHEN NOT FOUND;
    file_content_hstore := file_content_hstore || row_text_hstore || E'\n';
  END LOOP;
  CLOSE cursor_get_text_row_hstore;
  
  EXECUTE file_content_hstore;

ELSEIF cur_version > 90000 THEN
    RAISE NOTICE 'INSTALL EXTENSION FOR VERSION %', cur_version;
    EXECUTE 'CREATE EXTENSION "hstore";';
ELSE
    RAISE NOTICE 'NOT SUPPORTED VERSION SERVER %', cur_version;
END IF;


END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

SELECT system.install_extensions();

DROP FUNCTION system.install_extensions();




Если у кого-то есть замечания/предложения с радостью выслушаю...
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Устновка contrib расширений для разных версий одним файлом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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