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

PostgreSQL: pass path from psql to create table name dynamically

假设我有两条路径,/data/dev/data/prod。开发时想用dev目录,prod中想用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

如何以动态方式指定需要从中加载这些数据的目录?

创建一个 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

你们很接近。以下应该有效。

$ 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.

中的变量名称后列出多个值即可