通过 Laravel 连接 Postgresql 数据库遇到问题

5
我在使用WAMP/Windows环境下的Laravel 5.3与pgsql连接时遇到了问题,当我尝试用"php artisan migrate"迁移表时,出现了"PDO Exception - Could not find driver"错误。
以下是我的处理过程:
  1. 我安装了Postgres 9.6。
  2. 我启用了php中与postgresql相关的扩展:

enter image description here 3. 我将postgres库添加到了环境变量的路径中

enter image description here

  1. 我测试了pdo postgres连接,成功连接:


    $dbh = new PDO("pgsql:dbname=rotocms;host=127.0.0.1", "postgres", "mypassword");
if($dbh){ echo "connected"; }else{ echo 'there has been an error connecting'; }

所以,我被卡住了,无法在Laravel中进行迁移操作。我的.env文件如下:

    DB_CONNECTION=pgsql
    DB_HOST=127.0.0.1
    DB_PORT=5432
    DB_DATABASE=mydatabasename
    DB_USERNAME=postgres
    DB_PASSWORD=password

这是Laravel错误栈:
    local.ERROR: PDOException: could not find driver in C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php:119
Stack trace:
#0 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php(119): PDO->__construct('pgsql:host=127....', 'postgres', 'password', Array)
#1 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php(56): Illuminate\Database\Connectors\Connector->createPdoConnection('pgsql:host=127....', 'postgres', 'password', Array)
#2 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connectors\PostgresConnector.php(36): Illuminate\Database\Connectors\Connector->createConnection('pgsql:host=127....', Array, Array)
#3 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connectors\ConnectionFactory.php(100): Illuminate\Database\Connectors\PostgresConnector->connect(Array)
#4 [internal function]: Illuminate\Database\Connectors\ConnectionFactory->Illuminate\Database\Connectors\{closure}()
#5 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connection.php(964): call_user_func(Object(Closure))
#6 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connection.php(832): Illuminate\Database\Connection->getPdo()
#7 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connection.php(717): Illuminate\Database\Connection->reconnectIfMissingConnection()
#8 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Connection.php(350): Illuminate\Database\Connection->run('select * from i...', Array, Object(Closure))
#9 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Schema\PostgresBuilder.php(25): Illuminate\Database\Connection->select('select * from i...', Array)
#10 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Migrations\DatabaseMigrationRepository.php(156): Illuminate\Database\Schema\PostgresBuilder->hasTable('migrations')
#11 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php(515): Illuminate\Database\Migrations\DatabaseMigrationRepository->repositoryExists()
#12 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Console\Migrations\MigrateCommand.php(92): Illuminate\Database\Migrations\Migrator->repositoryExists()
#13 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Database\Console\Migrations\MigrateCommand.php(58): Illuminate\Database\Console\Migrations\MigrateCommand->prepareDatabase()
#14 [internal function]: Illuminate\Database\Console\Migrations\MigrateCommand->fire()
#15 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Container\Container.php(508): call_user_func_array(Array, Array)
#16 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Console\Command.php(169): Illuminate\Container\Container->call(Array)
#17 C:\wamp64\www\myproject\vendor\symfony\console\Command\Command.php(256): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Console\Command.php(155): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#19 C:\wamp64\www\myproject\vendor\symfony\console\Application.php(820): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#20 C:\wamp64\www\myproject\vendor\symfony\console\Application.php(187): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Database\Console\Migrations\MigrateCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#21 C:\wamp64\www\myproject\vendor\symfony\console\Application.php(118): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#22 C:\wamp64\www\myproject\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php(121): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#23 C:\wamp64\www\myproject\artisan(35): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#24 {main}  

此外,虽然我安装了PostgreSQL 9.6,但phpinfo()中的PostgreSQL (libpq)版本为9.4.4,不确定是否可以接受。


确保你已经在主php.ini文件中取消了那行告诉php Postgres驱动程序在哪里的注释(通常是extension=pgsql.so),请看这个链接 - https://dev59.com/Qmkw5IYBdhLWcg3wKneb - Saumya Rastogi
我正在使用Windows系统,并且已经发布了我的phpinfo postgresql部分。我的php.ini文件中的行没有被注释掉:extension=php_pdo_pgsql.dll和extension=php_pgsql.dll。 - Gabriel Stein
你是否在 .envdatabase.php 文件中都写了 数据库名称用户名密码 - Wasiq Muhammad
是的,我尝试过了,重启了一切,但仍然不起作用。还是同样的错误。:( - Gabriel Stein
3个回答

0

你需要查找一些东西,

确保在app/config/database.php中配置了“default”键。

对于postgres,这将是'default' => 'pgsql'

检查是否安装了正确的PHP扩展。您需要安装和启用pdo_pgsql.sopgsql.so。如何执行此操作因操作系统而异。

取消注释php.ini中的extension=pdo_pgsql.soextension=pgsql.so行。

现在将C:\wamp\bin\php\php5.*\中的libpq.dll复制到C:\wamp\bin\apache*\bin中,并重新启动所有服务。

如果问题仍然存在,请查看您的环境变量

让我知道结果。


我已经做了那个。并且已经阅读了这些答案。所以我在我的问题中描述了它。我将postgresql路径添加到了我的路径变量中,并发布了一张图片。我还按照我的问题中所见配置了laravel .env文件。对于5.3版本来说,'default' => 'postgres'是错误的,应该是'default' => 'pgsql'。 - Gabriel Stein
@AdnanMujkanovic 请卸载wamp服务器,然后重新安装。我还推荐xamp,它非常棒。 - user6519911
运行 php artisan config:cache @AdnanMujkanovic - Derk Jan Speelman

0

您还需要在本地安装Postgres驱动程序。在macOS上,您可以使用brew。

根据您的PHP版本(在终端中尝试php -v),使用以下命令:

brew install php71-pdo-pgsql
brew install php70-pdo-pgsql
brew install php55-pdo-pgsql

此外,如果您正在运行 Valet,请确保在执行 valet restart 之后进行操作。

0

config\database.php 文件中,有一个名为 database.php 的文件。

在这里选择默认的数据库类型为 pgsql,如下所示:

'default' => env('DB_CONNECTION', 'pgsql')

在这里修改并填写您的详细信息

'pgsql' => [
            'driver' => 'pgsql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'prefer',
        ]

重启你的服务器,希望它能连接上。


是的,我已经设置好了,'default' => env('DB_CONNECTION', 'pgsql')。即使在.env文件中定义了pgsql也足够了。DB_CONNECTION=pgsql。 - Gabriel Stein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接