【问题标题】:How to connect to a Postgres database without specifying a database name in PDO?如何连接到 Postgres 数据库而不在 PDO 中指定数据库名称?
【发布时间】:2017-06-26 01:13:11
【问题描述】:

我正在使用以下连接来连接没有数据库的 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

任何人都可以帮我解决如何在不使用 PHP PDO 选择任何数据库的情况下连接到 Postgres SQL

【问题讨论】:

  • 使用数据库postgres 连接到更多列表数据库
  • 使用数据库 pgsql。数据库名称不同。
  • @Deep ya 我提到的是数据库类型,如 MySQL、postgres
  • 尝试使用该用户配置文件使用 pgsql 客户端登录,看看是否会出现同样的错误

标签: php postgresql pdo


【解决方案1】:

由于您在 PostgreSQL 上始终有一个名为 postgres 的默认数据库,因此您可以默认情况下像这样与它建立连接:

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

然后你会在好的之后再做一个。

【讨论】:

    【解决方案2】:

    有树选项:

    • postgres
    • 模板0
    • 模板1

    请注意,连接到数据库需要权限。 Here 解释了模板是什么。你可以找postgresql default database。这是非常相似的主题。

    【讨论】:

      【解决方案3】:

      这个答案很好地解释了它:

      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);

      【讨论】:

        【解决方案4】:

        根据我从错误消息中了解到的情况,您的 DSN 似乎是错误的(admin,这是您的用户名和/或密码被解释为数据库名称)...

        【讨论】:

          【解决方案5】:

          除了当前的优秀答案之外,还考虑为每个 unix 用户(或至少为“admin”用户)创建一个 db,因此“psql”命令无需参数即可工作,您可以方便地使用它进行交互使用。

          【讨论】:

            【解决方案6】:

            如果不指定现有数据库,Postgresql 无法连接到数据库服务器。

            您收到此错误的原因:

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

            就是如果不指定数据库名,则默认尝试连接与指定用户同名的数据库(见连接参数说明dbname)。

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

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

            请参阅 Template Databases 了解这些的完整描述。

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

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

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

            【讨论】:

              【解决方案7】:

              您总是需要连接数据库。

              如果您不通知,连接器会尝试在与您尝试连接的用户同名的数据库中进行连接,因此,如果您尝试使用 "admin" 用户进行连接,则postgresql 尝试连接 "admin" 数据库。

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

              所有 postgresql 数据库都有“内部表”,前缀为 “pg_”

              所以,如果你想要 postgresql 中的数据库列表,你可以尝试在任何数据库中运行以下选择:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-26
                • 2011-05-27
                • 1970-01-01
                • 1970-01-01
                • 2015-01-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多