12

例如,假设我想从运行 postgres 服务器的同一台机器上的路径导入 CSV 文件。

系统上有一个环境变量MyPath设置为'/path/to/my/csv/file/'.

我可以轻松地导入这个 CSV 文件,如下所示:

COPY MyTable FROM
'/path/to/my/csv/file/myTable.csv'
DELIMITERS ','
CSV HEADER;

是否可以从此 postgres sql 命令中引用 MyPath 变量?大致如下:

COPY MyTable FROM
get_environmental_variable('MyPath') || 'myTable.csv'
DELIMITERS ','
CSV HEADER;
4

3 回答 3

11

开始时试试这个

 psql --set 'var=foo' -c '\i thesqlscript' 

这在查询中

update table set column = :var; 

这是取自论坛上的这个问题

如果您使用的是旧版本的 postgres,这看起来就像在 postgres 论坛中提出的相同问题(尽管这是很多年前的事了)。没有直接的方法,但他们提供了一些解决方法。

于 2013-04-17T02:08:41.150 回答
3

如果您安装PL/R,您可以使用 plr_environ() 函数来获取环境变量列表及其值COPY MyTable from (SELECT VALUE FROM plr_environ() WHERE name = 'MyPath'):其他存储过程语言可能有类似的方式——在 plpython 中,我想可以使用 os.environ['MyPath'],plperlu 可以访问 %ENV 哈希,等等。如果您需要进一步的帮助,请发表评论,我很乐意为您进一步研究。

于 2013-04-17T02:06:09.423 回答
3

在 Posix 系统(Linux、MacOS)上...

您可以访问与您正在使用的 postgresql角色匹配的系统用户的环境变量,通常是系统postgres用户(或运行 postgres 服务器的任何系统用户)。

因为env使用 '=' 作为分隔符,所以拆分k=v意味着您必须防止字符串values中出现 '=' 。

你可以做:

DROP TABLE IF EXISTS env;
DROP TABLE IF EXISTS env_tmp;
CREATE TEMP TABLE env_tmp(e text);
CREATE TEMP TABLE env(k text, v text);

COPY env_tmp ( e ) FROM PROGRAM 'env';

INSERT INTO env
SELECT (regexp_split_to_array(e,'={1,1}'))[1],
  (regexp_match(e, '={1,1}(.*)'))[1]
FROM env_tmp;

SELECT * FROM env;

            k             |         v                                                             
--------------------------+----------------------------
 LC_TIME                  | C
 DEPLOY_ENV               | local
 PG_VERSION               | 12.4-1.pgdg100+1
 LC_CTYPE                 | en_US.utf8
 LC_COLLATE               | en_US.utf8
 LANG                     | en_US.utf8
 LC_MESSAGES              | en_US.UTF-8
 PG_MAJOR                 | 12
 LC_NUMERIC               | C
 SERVICE_COMMAND          | postgres -c "config_file=postgresql.conf" -c "port=5432"

[...]

也应该可以使用“CSV”版本的 COPY 来做一些事情,我没有尝试过这种方式。

于 2020-10-10T14:31:04.827 回答