PostgreSQL:从文件系统加载文件而不插入表

Dam*_*ati 0 mysql postgresql file-io

我该怎么做?
在mysql中,我这样做:

SELECT LOAD_FILE('/path/to/file');
Run Code Online (Sandbox Code Playgroud)

那么postgres呢?不使用\copypsql命令?

Erw*_*ter 5

这取决于您要确切执行的操作。

  • 您具有COPY,用于将结构化数据读取到(临时)表中。
    请注意,这是SQL命令,与psql的\ copy命令相似,但不相同!

  • 并且有pg_read_file()可以读取任何文本文件。

编辑-一个基本示例:

CREATE FUNCTION f_showfile(myfile text)
  RETURNS text AS
$x$
BEGIN

RETURN pg_read_file(myfile, 0, 1000000); -- 1 MB max.
-- or you could read into a text var and do stuff with it.

END;
$x$
  LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

仅超级用户可以使用此功能。注意不要打开安全孔。您可以创建具有SECURITY DEFINERREVOKE FROM公共GRANT TO角色和选定角色的函数。如果安全是一个问题,在提供的链接中阅读本段:

安全地编写SECUREITY DEFINER函数

pg_read_file()您只能从日志文件目录和数据库目录中读取。在Linux上,您可以创建一个指向数据目录的符号链接(在安全的位置),如下所示:

cd /path//my/database
ln -s /var/lib/postgresql/text_dir/ .
Run Code Online (Sandbox Code Playgroud)

然后像这样调用:

SELECT f_showfile('text_dir/readme.txt');
Run Code Online (Sandbox Code Playgroud)

输出:

                                            f_showfile
-------------------------------------------------------------------------
 This is my text from a file.
Run Code Online (Sandbox Code Playgroud)