例如,假设我想从运行postgres服务器的同一台机器上的路径导入CSV文件.
MyPath系统上设置了环境变量'/path/to/my/csv/file/'.
我可以轻松导入此CSV文件,如下所示:
COPY MyTable FROM
'/path/to/my/csv/file/myTable.csv'
DELIMITERS ','
CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
是否可以从这个postgres sql命令中引用MyPath变量?以下内容:
COPY MyTable FROM
get_environmental_variable('MyPath') || 'myTable.csv'
DELIMITERS ','
CSV HEADER;
Run Code Online (Sandbox Code Playgroud)
开始时尝试这个
psql --set 'var=foo' -c '\i thesqlscript'
Run Code Online (Sandbox Code Playgroud)
而这在查询中
update table set column = :var;
Run Code Online (Sandbox Code Playgroud)
这是从论坛上的这个问题中获取的
如果您使用的是较旧版本的postgres,这看起来就像postgres论坛中提出的问题一样(尽管这是很多年前).没有直接的方法,但他们给出了几个解决方法.
在 Posix 系统(Linux、MacOS)上...
您可以访问与您正在使用的postgresql角色匹配的系统用户的环境变量,通常是系统postgres用户(或运行 postgres 服务器的任何系统用户)。
因为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;
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"
[...]
Run Code Online (Sandbox Code Playgroud)
还应该可以使用“CSV”版本的 COPY 执行某些操作,我还没有尝试过这种方式。
| 归档时间: |
|
| 查看次数: |
3952 次 |
| 最近记录: |