Как вставить текстовый файл в поле в PostgreSQL?

Как вставить текстовый файл в поле в PostgreSQL?

Я хочу вставить строку с полями из локального или удаленного текстового файла.

Я бы ожидал такую ​​функцию, как gettext() или geturl(), чтобы сделать следующее:

% INSERT INTO collection(id, path, content) VALUES(1, '/etc/motd', gettext('/etc/motd'));

-S.


person Stefan    schedule 18.05.2009    source источник


Ответы (5)


Самый простой способ — использовать один из встраиваемых языков сценариев. Вот пример использования plpythonu:

CREATE FUNCTION gettext(url TEXT) RETURNS TEXT
AS $$
import urllib2
try:
  f = urllib2.urlopen(url)
  return ''.join(f.readlines())
except Exception:
  return ""
$$ LANGUAGE plpythonu;

Одним из недостатков этой примерной функции является ее зависимость от urllib2, что означает, что вы должны использовать URL-адреса «file:///» для доступа к локальным файлам, например:

выберите gettext('file:///etc/motd');

person TML    schedule 19.05.2009
comment
Для создания этой функции необходимо быть суперпользователем. Лучше использовать клиентскую функцию. - person bortzmeyer; 29.05.2009
comment
Я не увидел в исходном вопросе ничего, что заставило бы меня поверить, что это не так. - person TML; 31.05.2009

Спасибо за советы. Я нашел еще один ответ со встроенной функцией. Для этого у вас должны быть права суперпользователя!

-- 1. Create a function to load a doc
-- DROP FUNCTION get_text_document(CHARACTER VARYING);
CREATE OR REPLACE FUNCTION get_text_document(p_filename CHARACTER VARYING)
  RETURNS TEXT AS $$
  -- Set the end read to some big number because we are too lazy to grab the length
  -- and it will cut of at the EOF anyway
  SELECT CAST(pg_read_file(E'mydocuments/' || $1 ,0, 100000000) AS TEXT);
$$ LANGUAGE sql VOLATILE SECURITY DEFINER;
ALTER FUNCTION get_text_document(CHARACTER VARYING) OWNER TO postgres;

-- 2. Determine the location of your cluster by running as super user:
SELECT name, setting FROM pg_settings WHERE name='data_directory'; 

-- 3. Copy the files you want to import into <data_directory>/mydocuments/
--    and test it: 
SELECT get_text_document('file1.txt');

-- 4. Now do the import (HINT: File must be UTF-8) 
INSERT INTO mytable(file, content)
  VALUES ('file1.txt', get_text_document('file1.txt'));
person Stefan    schedule 22.05.2009

Команда Postgres COPY предназначена именно для этого.

Мой совет — загрузить его во временную таблицу, а затем перенести данные в основную таблицу, когда вы будете довольны форматированием. например

CREATE table text_data (text varchar)
COPY text_data FROM 'C:\mytempfolder\textdata.txt';
INSERT INTO main_table (value) 
  SELECT string_agg(text, chr(10)) FROM text_data;
DROP TABLE text_data; 

Также см. этот вопрос .

person kemosabe    schedule 25.01.2020

Вы не можете. Вам нужно написать программу, которая будет читать содержимое файла (или URL-адреса) и сохранять его в нужном поле.

person Pablo Santa Cruz    schedule 18.05.2009

Используйте КОПИРОВАТЬ вместо ВСТАВИТЬ

ссылка: http://www.commandprompt.com/ppbook/x5504#AEN5631

person Ross    schedule 03.02.2012