#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-код, похоже, беззвучно завершился сбоем. После повторного создания соответствующего изображения (которое я уже пробовал несколько раз) теперь все работает. К сожалению, я не знаю, в чем была проблема, но мой код, похоже, работает.