如何在PDO中未指定数据库名称的情况下连接到Postgres数据库?

时间:2017-02-08 12:11:06

标签: php postgresql pdo

我使用以下连接连接到没有数据库的Postgres SQL,因为我需要稍后获取所有数据库名称以进行配置

try{
    $this->connection = new \PDO($this->database.":host=".$this->host,$this->user,$this->password);
    $this->connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
    return $this->connection;
}catch(\PDOException $e){
    echo $e->getMessage();
}

但是我收到以下错误

SQLSTATE[08006] [7] FATAL: database "admin" does not exist

以下是属性中设置的值:

$this->database = pgsql
$this->host = localhost
$this->user = admin
$this->password = admin

任何人都可以帮我解决如何连接到Postgres SQL而无需使用PHP PDO进行任何数据库选择

7 个答案:

答案 0 :(得分:0)

由于你总是在PostgreSQL上有一个名为postgres的默认数据库,你可以默认建立一个这样的连接:

$dbh = new PDO($this->database.":host=".$this->host.";dbname=postgres",$this->user,$this->password);

然后你会再做一个好的。

答案 1 :(得分:0)

有树选项:

  • postgres的
  • template0
  • template1

请注意,与数据库的连接需要获得许可。 Here解释了模板的含义。您可以查找postgresql default database。这是一个非常相似的主题。

答案 2 :(得分:0)

这个答案解释得很好:

https://stackoverflow.com/questions/2370525#2411860

您需要明确指向一个始终保证如上所述存在的数据库,即" postgres":$this->connection = new PDO($this->database.":host=".$this->host.";dbname=postgres",$this->user,$this->password);

...或者如果愿意,请设置$this->dbname = postgres,然后设置$this->connection = new PDO($this->database.":host=".$this->host.";dbname=".$this->dbname,$this->user,$this->password);

答案 3 :(得分:0)

对于我从错误消息中理解的内容,您的DSN似乎是错误的(admin,这是您的用户名和/或密码被解释为数据库名称)...

答案 4 :(得分:0)

除了目前优秀的答案之外,还要考虑为每个unix用户创建一个数据库(或至少为" admin"用户),所以" psql"命令在没有参数的情况下工作,您可以方便地使用它进行交互式使用。

答案 5 :(得分:0)

Postgresql无法在未指定现有数据库的情况下连接到数据库服务器。

您收到此错误的原因:

SQLSTATE[08006] [7] FATAL: database "admin" does not exist

如果您没有指定数据库名称,它将默认尝试连接到与您指定的用户同名的数据库(请参阅连接参数dbname的说明)。

首次初始化postgresql时,会创建三个默认数据库:

  • postgres - 用作默认管理员用户postgres访问
  • 的通用数据库
  • template0 - 主模板 - 初始化后不应更改
  • template1 - 默认模板 - 用于从
  • 创建所有新数据库

有关这些内容的完整说明,请参阅Template Databases

如果要获取可用数据库的列表,则需要连接到上述数据库之一。

我通常会使用template1,因为理论上postgres数据库可能已被删除,如果您意外更改它,连接到template0数据库会很危险。由于template1在创建数据库时用作默认模板,因此很可能存在。

另请注意,您连接的任何用户都需要具有连接到给定数据库的权限。所有这三个数据库都归postgres用户所有,这意味着如果您不使用此用户进行连接,则必须确保您使用的用户有权访问该数据库。

答案 6 :(得分:0)

您始终需要连接数据库。

如果不通知,连接器将尝试使用您尝试连接的用户名与数据库连接,因此,如果尝试与“ admin” 用户连接,则连接器postgresql尝试在“ admin” 数据库上进行连接。

如果postgresql找不到“ admin” 数据库,则连接器返回答案中提到的错误。

所有postgresql数据库都具有“内部表”,其前缀为“ pg _”

因此,如果要使用postgresql中的数据库列表,则可以尝试在任何数据库中运行以下选择:

warehouse2=# select datname from pg_database;
  datname   
------------
 postgres
 template1
 template0
 warehouse2
(4 rows)

在此示例中,我列出了集群中的所有数据库,其中包含4个数据库。