如何使用带有 createdb 和 URI 的终端?

Pet*_*uss 3 postgresql uri database-connection

的URI连接字符串可以是如此复杂,这里的标准例如:

  createdb "postgresql://postgres:postgres@localhost:5432/sandbox"
Run Code Online (Sandbox Code Playgroud)

当然,它不适用于createdb ("template1: FATAL"),这就是问题所在。URI 工作正常psql,例如。

  psql "postgresql://postgres:postgres@localhost:5432/postgres"
Run Code Online (Sandbox Code Playgroud)

我正在寻找具有预期行为的任何内容,无论命令的名称是否不同于createdb.


PS1:在我的环境中。即使对于postgres用户,也有密码等,并且我所有的脚本都使用URI 连接字符串标准,没有更多-U等选项。这个问题的重点是URI标准。使用现代客户端和连接,v9+。

PS2:作为它的传统和哲学,我们期望PostgreSQL 提供的命令中的正交行为。psql并且pg_dump关于 URI 是正交的;psql,pg_dump并且createdb关于-U 选项是正交的......我预计URI使用
有一些正交性......或者存在架构错误?

Adr*_*ver 6

clusterdb、createdb、createuser、dropdb、dropuser、reindexdb 和vacuumdb 是实用程序命令,它们是SQL 命令的包装器。虽然没有被正式弃用,但它们在任何人关心的程序列表中都不高。如今,大多数人使用某种脚本来完成他们所做的工作。如果要使用客户端程序和 URI 来执行 CREATE DATABASE,则:

psql "postgresql://postgres:postgres@localhost:5432/postgres" -c 'CREATE DATABASE my_test_db'
Null display is "NULL".
CREATE DATABASE
Run Code Online (Sandbox Code Playgroud)

或者使用以下方法传入文件:

psql "postgresql://postgres:postgres@localhost:5432/postgres" -f db_create.sql
Run Code Online (Sandbox Code Playgroud)

更新 12/05/2020

似乎有一个未记录的功能现已被揭露。对于这些命令中的大多数(不是 *user),都有一个--maintenance-db选项。来自CREATEDB开发文档:

--maintenance-db=dbname

指定创建新数据库时要连接的数据库的名称。如果未指定,将使用 postgres 数据库;如果它不存在(或者它是正在创建的新数据库的名称),则将使用 template1。这可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

其中连接字符串可以是URI.