如何将文本文件插入到 PostgreSQL 中的字段中?

3
如何将文本文件插入到PostgreSQL字段中?
我想插入一行,其中包含来自本地或远程文本文件的字段。
我希望有一个类似于gettext()或geturl()的函数,以便执行以下操作:
% INSERT INTO collection(id, path, content) VALUES(1, '/etc/motd', gettext('/etc/motd'));
-S.
5个回答

4

最简单的方法是使用可嵌入的脚本语言之一。以下是使用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,这意味着您必须使用"file:///" URL才能访问本地文件,就像这样:

select gettext('file:///etc/motd');


需要超级用户权限才能创建此函数。最好使用客户端函数。 - bortzmeyer
我在原始问题中没有看到任何迹象表明他不是。 - TML

2

感谢您的建议。我找到了另一个内置函数的答案。 您需要拥有超级用户权限才能执行该操作!

-- 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'));

1

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; 

另请参见此问题

0
你无法手动完成此任务,需要编写一个程序来读取文件内容(或 URL),并将其存储到所需的字段中。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接