如何在psql中包含与当前执行的脚本相对应的文件?[英] How to include files relative to the current executing script in psql?

本文是小编为大家收集整理的关于如何在psql中包含与当前执行的脚本相对应的文件?的处理方法,想解了如何在psql中包含与当前执行的脚本相对应的文件?的问题怎么解决?如何在psql中包含与当前执行的脚本相对应的文件?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个 PostgreSQL 脚本(比如 ~/sql/ 中的 MAIN.sql),其中包含类似

的行
\i components/helper-functions.sql

如果 $PWD 与我的脚本 (~/sql/) 的目录相同,则此包含工作正常,但如果不是,它会查找相对于 $PWD 而不是相对于 MAIN.sql 的包含文件.

所以如果我从 ~/ 调用脚本,它会查找 ~/components/helper-functions.sql 而不是 ~/sql/components/helper-functions.sql.

我认为 9.2 中将包含一个新的 \ir 指令来解决这个问题,但我正在运行 8.3

推荐答案

将目录名称作为 psql 变量传入,并使用它来组装包含文件的绝对路径,例如,

$ cat ./tmp/foo.sql
\echo 'This is foo.'
\set abs_bar_sql :DIR '/bar.sql'
\i :abs_bar_sql

$ cat ./tmp/bar.sql
\echo 'This is bar.'

$ psql -f ./tmp/foo.sql -v DIR=$PWD/tmp
This is foo.
This is bar.

它并不漂亮,但这就是为什么要添加 \ir 的原因.

本文地址:https://www.itbaoku.cn/post/1763800.html