psql,获取要由脚本解析的数据库列表

Ren*_*ena 5 postgresql psql

我想使用 psql 列出 Postgres 服务器上的所有数据库,以便由脚本解析。此命令列出了它们:

psql -l -A -t
Run Code Online (Sandbox Code Playgroud)

但输出显示了一个明显的问题:记录由换行符分隔,但也包含换行符。

$ psql -l -A -t
postgres|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|
template0|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|=c/postgres
postgres=CTc/postgres
template1|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|=c/postgres
postgres=CTc/postgres
Run Code Online (Sandbox Code Playgroud)

使用 -R 选项我可以更改记录分隔符,但似乎无论我将其更改为什么,都存在该字符串出现在数据中的风险。是否可以告诉 psql 用其他东西替换数据中的换行符?(然后如果字符串也出现在数据中呢?)

我还尝试设置的记录分隔符为空字符这样的序列-R '\000'-R "\0",但它似乎并没有解释转义序列在所有的参数,并且只使用文本字符串\000代替。

我知道列出所有数据库的另一个选项是:

psql --quiet --no-align --tuples-only --dbname=postgres --username=postgres --host=127.0.0.1 --port=5432 --command="SELECT datname FROM pg_database"
Run Code Online (Sandbox Code Playgroud)

但这需要我为 postgres 用户提供密码,所以这是不可取的。也许还有另一种方法可以获得所有数据库的名称列表?

Joi*_*dio 7

我看不出你的两个解决方案有什么不同......因为它仍然必须实际连接到数据库实例才能看到那里有哪些数据库,我敢打赌唯一不同的是你的连接方式。

psql -l -A -t
Run Code Online (Sandbox Code Playgroud)

对比

psql --quiet --no-align --tuples-only --dbname=postgres --username=postgres --host=127.0.0.1 --port=5432 --command="SELECT datname FROM pg_database"
Run Code Online (Sandbox Code Playgroud)

试试吧

psql -q -A -t -c "SELECT datname FROM pg_database"
Run Code Online (Sandbox Code Playgroud)

这应该使用默认连接设置(数据库和登录为本地帐户、本地连接、5432 端口)。如果确实需要,请使用 -U postgres -d postgres .. 指定用户和数据库,否则只需不指定主机和端口即可。

我敢打赌 psql -l -A -t 不要求输入密码的唯一原因是您的 .pgpass 文件中有该信息。


dez*_*zso 5

第二种解决方案很可能要求输入密码,因为您以不同的方式连接到数据库。我想您使用的是某种类 Unix 系统 - 在这种情况下,第一个命令将通过 Unix 套接字连接,第二个命令将通过 TCP 连接。如果你只是说(主要像Joishi Bodio建议的那样,但我在这里看不到该-q标志的优点)

psql -A -t -c "SELECT datname FROM pg_database"
Run Code Online (Sandbox Code Playgroud)

它应该返回你想要的东西。