«База данных не существует» при попытке создать новую базу данных Postgres с помощью PHP

#php #laravel #postgresql #laravel-artisan

#php #laravel #postgresql #laravel-artisan

Вопрос:

Я хочу создать базу данных Postgres из PHP. Это мой код:

 public function handle()
{
    $schemaName = 'new_database';
    $port = env('DB_PORT') ?: '5432';

    // Connecting to postgres
    $pdo = $this->getPDOConnection(env('DB_SAMPLE_HOST'), $port, env('DB_SAMPLE_USERNAME'), env('DB_SAMPLE_PASSWORD'));
    
    $pdo->exec(sprintf(
      'CREATE DATABASE %s;',
      $schemaName,
      'utf8',
      'utf8_unicode_ci'
    ));
}


private function getPDOConnection($host, $port, $username, $password)
{
    return new PDO(sprintf('pgsql:host=%s;port=%d;sslmode=prefer', $host, $port), $username, $password);
}
 

Все это происходит внутри команды Laravel / Artisan. handle Функция является точкой входа. Я ожидаю, что этот код подключится к хосту Postgres getPDOConnection , а затем создаст базу exec данных. Вместо этого я получаю эту ошибку (я удалил фактические значения пользователя и пароля):

 1   PDOException::("SQLSTATE[08006] [7] FATAL:  database "new_database" does not exist")
    /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

2   PDO::__construct("pgsql:host=postgres;dbname=new_database;port=5432;sslmode=disable", <user>, <password>, [])
    var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
 

В чем здесь проблема? Кажется, я что-то совершенно неправильно понимаю, поскольку сообщение об ошибке сообщает мне, что база данных, которую я только что хотел создать, не существует.

Комментарии:

1. Вы уверены, что имеющиеся у вас учетные данные имеют необходимые права для создания новой базы данных? (или на самом деле вы хотите создать таблицу?)

2. Я действительно хочу создать базу данных. Все это происходит в контексте Docker / container, поэтому вполне может быть проблемой с разрешениями. В данный момент я изучаю это. Но разве в этом случае я не должен получать другое сообщение об ошибке?

3. В сообщении об ошибке указано, что вы выполняете PDO::__construct("pgsql:host=postgres;dbname=new_database;port=5432;sslmode=disable", <user>, <password>, []) , при создании pdo, который вы передаете с помощью database ( ...;dbname=new_database... ), существует ли база данных на данный момент?

4. Спасибо за подсказку. Я понял, что текст __construct function в сообщении об ошибке похож на код внутри getPDOConnection только по совпадению. Сообщение об ошибке, похоже, пришло из команды миграции, в то время как мой PHP-код, похоже, беззвучно завершился сбоем. После повторного создания соответствующего изображения (которое я уже пробовал несколько раз) теперь все работает. К сожалению, я не знаю, в чем была проблема, но мой код, похоже, работает.