我正在尝试创建一组脚本来修改 Postgres 9.6 数据库中的某些表。这些脚本存储在各种目录中,并依次从一个主协调器脚本调用。我正在 psql 中运行脚本。
在主脚本中,我用来\ir指定其他脚本的相对路径名。因此,我可以从任何地方运行 psql,并且主脚本将找到其他脚本。这按预期工作。
然而,在某些脚本中,我使用\copy命令从 CSV 文件加载数据。不幸的是,似乎输入文件名\copy始终被解释为相对于 psql 的当前工作目录,而不是相对于其脚本的目录,即使我\copy使用\ir.
例如,假设我从 开始psql,C:\并计划使用以下文件:
C:\
dir1\
script1.sql
dir2\
script2.sql
input.csv
Run Code Online (Sandbox Code Playgroud)
我可以使用调用第一个脚本\ir dir1/script1.sql。效果很好。
此外,该脚本可以使用 调用第二个脚本\ir dir2/script2.sql。这也很好用。
问题是\copy第二个脚本中的命令:
\COPY foo.bar (col1) FROM 'input.csv' WITH (FORMAT CSV);
Run Code Online (Sandbox Code Playgroud)
input.csv除非存在于会话的当前目录中,否则此操作将失败psql。因此,我的问题是:
\COPY ... FROM从脚本内部调用命令,而不要求用户psql从相对于输入文件的特定目录运行会话?我知道我可以使用绝对路径名,但在升级不同的部署时,我们将从各种不同的计算机/平台运行此脚本,因此在这种情况下没有可用的通用绝对路径。我正在寻找某种相对或可配置的路径解决方案。
先感谢您。