我想使用 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 用户提供密码,所以这是不可取的。也许还有另一种方法可以获得所有数据库的名称列表?
我看不出你的两个解决方案有什么不同......因为它仍然必须实际连接到数据库实例才能看到那里有哪些数据库,我敢打赌唯一不同的是你的连接方式。
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 文件中有该信息。
第二种解决方案很可能要求输入密码,因为您以不同的方式连接到数据库。我想您使用的是某种类 Unix 系统 - 在这种情况下,第一个命令将通过 Unix 套接字连接,第二个命令将通过 TCP 连接。如果你只是说(主要像Joishi Bodio建议的那样,但我在这里看不到该-q
标志的优点)
psql -A -t -c "SELECT datname FROM pg_database"
Run Code Online (Sandbox Code Playgroud)
它应该返回你想要的东西。
归档时间: |
|
查看次数: |
2013 次 |
最近记录: |