PostgreSQL:从psql传递路径以动态创建表名

时间:2019-07-15 14:33:52

标签: postgresql psql

假设我有两条路径,/data/dev/data/prod。开发时,我想使用dev目录,而在产品中,我想使用prod目录。

我需要以一定间隔(upload_to_tables.sql)上传数据:

file := :basedir || 'file.csv';
COPY my_table FROM :file WITH (FORMAT csv);

我尝试运行此$ environment=dev; psql -d my_database -v basedir="'/data/$environment'" -f upload_to_tables.sql

我收到此错误:

2019-07-15 09:24:52.302 CDT [90820] ERROR:  syntax error at or near "file" at character 1

如何设置需要动态加载这些数据的目录?

2 个答案:

答案 0 :(得分:1)

创建一个显示文件内容的shell脚本,例如

$cat ts.sh  

#!/bin/bash
basedir=/data/dev
file=${basedir}"/file.csv"
cat ${file}

现在,\copyCOPY可以使用PROGRAM选项

\copy t from program 'ts.sh' with delimiter ',' CSV

答案 1 :(得分:1)

您距离很近。以下应该起作用。

$ environment=dev && psql -d my_database -v basedir="/data/$environment/" -f upload_to_tables.sql
\set file :basedir 'file.csv'
COPY my_table FROM :'file' WITH (FORMAT csv);

通常,在设置变量时,您不必理会引号。您可以使用:'var'作为字符串或使用:"var"作为标识符来访问变量的内容。

要连接变量并将其存储为新变量,您只需在\set var value中的变量名称后列出多个值即可。