是否可以在postgresql命令中引用环境变量?

时间:2013-04-17 01:58:32

标签: sql postgresql

例如,假设我想从运行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;

3 个答案:

答案 0 :(得分:7)

启动时尝试此操作

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

这在查询中

update table set column = :var; 

这取自this question on the forum

如果您使用的是旧版本的postgres,这看起来就像in the postgres forum提出的问题一样(尽管这是很多年前)。 没有直接的方法,但他们提供了几个解决方法。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

在Linux上。
您可以访问与系统用户相匹配的环境变量,该系统变量与您所使用的Postgresql 角色相匹配,通常只有 postgres

create temp table env(e text);
COPY env ( e ) FROM  PROGRAM 'env';
table env;

防止env使用'='作为分隔符。
如果您对k:v进行了拆分,则必须防止环境的字符串中出现'=',您可以尝试:

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;

table 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"

[...]

使用COPY的“ CSV”版本也可以做一些事情,我还没有尝试过。