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手册中有详细解释:
如果我正确理解您的问题,您可以将单个字符串读入临时表并将其用于插入:
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”,这是不安全的(但是是一个很好的集合点;-)