Postgresql:从文件中插入列的值

use*_*747 14 postgresql file-io

例如,有一个名为'testtable'的表,其中包含以下列:testint(整数)和testtext(varchar(30)).

我想要做的就是这样的事情:

INSERT INTO testtable VALUES(15, CONTENT_OF_FILE('file'));
Run Code Online (Sandbox Code Playgroud)

在阅读postgresql文档时,我所能找到的只是COPY TO/FROM命令,但是那个应用于表而不是单列.

那么,我该怎么办?

vog*_*vog 24

如果此SQL代码是从您的编程语言动态执行的,请使用该语言的方法读取该文件,并执行普通的INSERT语句.

但是,如果要通过psql命令行工具执行此SQL代码,则可以使用以下构造:

\set content `cat file`
INSERT INTO testtable VALUES(15, :'content');

请注意,此语法特定于psql并使用catshell命令.

它在PostgreSQL手册中有详细解释:


wil*_*ser 3

如果我正确理解您的问题,您可以将单个字符串读入临时表并将其用于插入:

DROP SCHEMA str CASCADE;
CREATE SCHEMA str;

SET search_path='str';

CREATE TABLE strings
    ( string_id INTEGER PRIMARY KEY
    , the_string varchar
    );
CREATE TEMP TABLE string_only
    ( the_string varchar
    );

COPY string_only(the_string)
FROM '/tmp/string'
    ;   

INSERT INTO strings(string_id,the_string)
SELECT 5, t.the_string
FROM string_only t
    ;   

SELECT * FROM strings;
Run Code Online (Sandbox Code Playgroud)

结果:

NOTICE:  drop cascades to table str.strings
DROP SCHEMA
CREATE SCHEMA
SET
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "strings_pkey" for table "strings"
CREATE TABLE
CREATE TABLE
COPY 1
INSERT 0 1
 string_id |     the_string      
-----------+---------------------
         5 | this is the content
(1 row)
Run Code Online (Sandbox Code Playgroud)

请注意,服务器“看到”该文件就像服务器看到文件系统一样。从这个角度来看,“当前目录”可能是 $PG_DATA,但您不应该假设任何内容,并指定完整的路径名,服务器应该可以访问和读取该路径名。这就是为什么我使用“/tmp”,这是不安全的(但是是一个很好的集合点;-)