如何在不指定数据库名称的情况下连接到 PostgreSQL?
Posted
技术标签:
【中文标题】如何在不指定数据库名称的情况下连接到 PostgreSQL?【英文标题】:How do I connect to PostgreSQL without specifying a database name? 【发布时间】:2011-05-27 20:33:37 【问题描述】:我需要连接到一些提供一些凭据的 PostgreSQL 服务器,并打印该主机上给定用户的可用数据库列表。
我正在尝试:
<?php
$connection = pg_connect("host=localhost user=testuser password=123 connect_timeout=5");
?>
我得到:
Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: FATAL: database "testuser" does not exist in /var/www/test.php on line 56
我认为这一定是可能的,因为 phpPgAdmin 做到了,但我查看了 phpPpAdmin 源,发现它们连接到一个名为 template1
的数据库。
来自http://www.postgresql.org/docs/8.1/interactive/manage-ag-templatedbs.html:
CREATE DATABASE 实际上是通过复制现有数据库来工作的。经过 默认情况下,它会复制名为 template1 的标准系统数据库。因此 该数据库是创建新数据库的“模板”。如果 您将对象添加到 template1,这些对象将被复制到 随后创建了用户数据库。此行为允许站点本地 修改数据库中的标准对象集。为了 例如,如果您在模板 1 中安装过程语言 PL/pgSQL, 它将自动在用户数据库中可用,无需任何额外的 建立这些数据库时正在采取的行动。
有没有不指定任何数据库的连接方式?
【问题讨论】:
【参考方案1】:您必须连接到数据库。您可以将哪个数据库用于“维护数据库”取决于安装和后续管理。默认安装后,有 2 个数据库可用于初始连接 - “template1”和“postgres”。明智的做法是创建一个新用户和一个具有相同名称的数据库并使用它们。
【讨论】:
如果需要创建数据库,可以在命令行中使用createdb
语句。您只需将访问凭据作为参数传递。
当心!使用template1
进行初始连接是个坏主意,因为它应该用作创建新数据库的默认模板。如果此数据库存在活动连接,则没有人可以创建新数据库。
@IgorPomaranskiy 我们仍然可以使用CREATE DATABASE somedb TEMPLATE template0
创建数据库
createdb zzz
; psql -d zzz -U victoria
; \l
; \c <desired db, or create new db in psql shell>
。如果您以后想删除它,请使用dropdb zzz
,或者将其保留为默认的“虚拟”数据库,用于 psql 连接。【参考方案2】:
为什么不连接到您的维护数据库(通常是postgres
?)。我不知道这是否会奏效。但我相信无论如何您都必须查询此数据库才能检索给定用户可用的数据库。
【讨论】:
【参考方案3】:正如manual of pg_connect 所说,连接字符串中的dbname 参数默认为用户参数的值。这就是它使用“testuser”的原因。如果您希望 dbname 为空,请尝试 "... dbname='' ..."
。
【讨论】:
如果我这样做,错误是一样的。 PostgreSQL 仍然尝试连接到数据库'testuser'...以上是关于如何在不指定数据库名称的情况下连接到 PostgreSQL?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 EF 的情况下连接到 ASP.NET Core Web API 中的数据库?