Найти в Дзене
programmer's notes (python and more)

Реляционные базы данных и язык SQL. Хранимые функции на PLpgSQL в PostgreSQL и внешние файлы

Доброго здоровья читателям моего канала programmer's notes. Поддерживаем мой канал.

Предыдущая статья по хранимым функциям здесь

Работа с файлами из хранимых функций PLpgSQL в PostgreSQL

Следует отметить, что использование хранимых функций даёт довольно интересную возможность. Можно работать не только с базами данных, но и, например, с файлами. И это даёт довольно богатые возможности при создании клиент-серверных приложений. Дело в том, что некоторые данные гораздо удобнее хранить в виде файлов, а не в виде элементов таблиц, да и данные для обработки могут поступать в разном формате.

Рассмотрим следующую хранимую функцию.

create or replace function gettext(fn text)
returns text
as
$$
declare
t text := pg_read_file(fn);
begin
return t;
end;
$$
language 'plpgsql';

Она читает текстовый файл с сервера, где расположен PostgreSQL и возвращает его в виде поля таблицы типа text, состоящей из одной строки. Вызвать функцию можно стандартным образом

select * from gettext('text.txt');

Клиент, получив данное, может своими средствами проводить его анализ, передавать пользователю и т. д.

В работе с файлами, через PostgreSQL есть одна важная деталь, которую следует учесть. Чаще всего, для PostgreSQL корневым каталогом является его собственный каталог. Для того, чтобы узнать этого каталог можно выполнить команду

show data_directory;

В частности в моём случае я получил каталог /var/lib/pgsql/data. Соответственно, текстовый файл находился именно там. Если, например, ваш файл будет находиться в корневом каталоге /, то вызов будет таким

select * from gettext('../../../../text.txt');

Можно не только читать файлы на стороне сервер PostgreSQL, но создавать файлы. Рассмотрим создание текстового файла. Следует только отметить, что аналога встроенной функции, которую мы использовали для чтения, для записи нет. Но есть многофункциональная команда copy, которую мы и будем использовать.

create or replace function puttext(fn text, tx text)
returns void
as
$$
declare
command text;
begin
execute 'create table tbl (tt text)';
execute 'insert into tbl (tt) values ($1)' using tx;
command := 'copy tbl to '||quote_literal(fn);
execute command;
execute 'drop table tbl';
return;
end;
$$
language 'plpgsql';

Прокомментируем, представленную выше функцию.

1. Она ничего не возвращает, поэтому запустить её можно так

select puttext('/home/admin/file.txt', 'Привет, привет, мир!');

2. Важно отметить различие между путём к файлу из предыдущего примера и в данном случае. Если в предыдущем примере корневой каталог отсчитывался от каталога PostgreSQL, то в данном примере абсолютный путь отсчитывается, как это принято в операционной системе Linux от /. При это для пользователя postgres доступ к указанному каталогу /home/admin должен быть открыт для записи.

3. Важно отметить роль функции quote_literal(). Она нам необходима, чтобы полное имя файла было заключено в кавычки, т. е. строка command будет равна copy tbl to '/home/admin/file.txt'.

4. Универсальная команда copy позволяет копировать данные и из файла в таблицу и из таблицы в файл. Поэтому мы в начале создаём таблицу, добавляем туда строку с текстом, потому копируем из таблицы текст в файл, а таблицу удаляем.

Предыдущая статья по хранимым функциям на PostgreSQL здесь

Пока всё!

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Мы дотянемся до ваших файлов, у нас длинные руки
Мы дотянемся до ваших файлов, у нас длинные руки