3

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

我想插入一行,其中包含来自本地或远程文本文件的字段。

我希望像 gettext() 或 geturl() 这样的函数来执行以下操作:

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

-S。

4

5 回答 5

4

最简单的方法是使用一种可嵌入的脚本语言。下面是一个使用 plpythonu 的例子:

创建函数 gettext(url TEXT) 返回文本
作为$$
导入 urllib2
尝试:
  f = urllib2.urlopen(url)
  返回 '​​'.join(f.readlines())
除了例外:
  返回 ””
$$ 语言 plpythonu;

这个示例函数的一个缺点是它依赖于 urllib2,这意味着您必须使用“file:///” URL 来访问本地文件,如下所示:

选择 gettext('file:///etc/motd');

于 2009-05-19T01:51:49.897 回答
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'));
于 2009-05-22T23:10:25.713 回答
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; 

另请参阅此问题

于 2020-01-25T10:28:36.407 回答
0

你不能。您需要编写一个程序来读取文件内容(或 URL)并将其存储到所需的字段中。

于 2009-05-18T19:48:05.230 回答
0

使用 COPY 而不是 INSERT

参考: http: //www.commandprompt.com/ppbook/x5504#AEN5631

于 2012-02-03T02:39:56.697 回答