Laravel: 错误 [PDOException]: 在 PostgreSQL 中找不到驱动程序

103

我正在尝试通过Laravel连接PostgreSQL数据库以执行php artisan migrate,但似乎没有成功,因为它正在读取MySQL的数据库名称。

这是来自database.php的命令:

'connections' => array(

    'sqlite' => array(
        'driver'   => 'sqlite',
        'database' => __DIR__.'/../database/production.sqlite',
        'prefix'   => '',
    ),

    'mysql' => array(
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'database',
        'username'  => 'root',
        'password'  => '',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),

    'pgsql' => array(
        'driver'   => 'pgsql',
        'host'     => 'localhost',
        'database' => 'postgres',
        'username' => 'postgres',
        'password' => 'root',
        'charset'  => 'utf8',
        'prefix'   => '',
        'schema'   => 'public',
    ),

    'sqlsrv' => array(
        'driver'   => 'sqlsrv',
        'host'     => 'localhost',
        'database' => 'database',
        'username' => 'root',
        'password' => '',
        'prefix'   => '',
    ),

),
如果我删除MySQL路径,将会得到:
[InvalidArgumentException]
Database [mysql] not configured.
当尝试运行'php artisan migrate'时,我遇到了'PDOException: could not find driver'的问题。我正在使用WAMP并且在Win8.1上。使用PostgreSQL作为数据库。
已经尝试了一系列的替代方案,但我仍然需要解决这个问题。在Apache、WAMP(从php文件夹中)和PostgreSQL中检查了php.ini文件。extension_dir是正确的,就像这样-> extension_dir = "c:/wamp/bin/php/php5.5.12/ext/"
extension=pdo_pgsql.dll和extension=pgsql.dll都被取消注释。
在“系统变量”中进行了路径设置的修改并重新启动电脑,但没有改善。
感谢到目前为止提供的帮助。
这是我的驱动程序php_pdo_driver.h和php_pdo.h,位于C:\Program Files (x86)\PostgreSQL\EnterpriseDB-ApachePHP\php\SDK\include\ext\pdo目录下。
来自phpinfo的信息:
PHP版本5.5.12
编译器MSVC11(Visual C++ 2012)
Configure Command cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=C:\php-sdk\oracle\x64\instantclient10\sdk,shared" "--with-oci8=C:\php-sdk\oracle\x64\instantclient10\sdk,shared" "--with-oci8-11g=C:\php-sdk\oracle\x64\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--with-mcrypt=static" "--disable-static-analyze" "--with-pgo"

如果“database”是您的数据库名称,则您正在使用保留字作为数据库名称。 - David Jones
1
我的PostgreSQL数据库名称是postgres,正如代码中所示。 - Hyperion
太棒了,我完全误读了你的帖子。你确定Laravel默认尝试连接到你的Postgres数据库吗? - David Jones
我不这样认为 :( 它似乎默认尝试连接到MySQL,而我想找出如何连接到它。猜测用户 sgt 已经弄清楚了。非常感谢,我的朋友。 - Hyperion
22个回答

105

请务必在 app/config/database.php 中配置 'default' 键。

对于 PostgreSQL,应为 'default' => 'postgres',

如果出现 [PDOException] could not find driver 错误,请检查是否安装了正确的 PHP 扩展。您需要安装并启用 pdo_pgsql.sopgsql.so。如何安装这些扩展因操作系统而异。

对于 Windows,pgsql 扩展应与官方 PHP 发行版一起预下载。只需编辑您的 php.ini 并取消注释以下行:extension=pdo_pgsql.soextension=pgsql.so

此外,在 php.ini 中,请确保将 extension_dir 设置为正确的目录。它应该是您的 PHP 安装目录中名为 extensionsext 的文件夹或类似文件夹。

最后,将 C:\wamp\bin\php\php5.*\ 中的 libpq.dll 复制到 C:\wamp\bin\apache*\bin 中,并通过 WampServer 接口重新启动所有服务。

如果仍然收到异常消息,可能需要将 PostgreSQL 的 \bin 目录添加到您的 PATH 中:

  1. 系统属性 -> 高级选项卡 -> 环境变量
  2. 在窗口下半部分的“系统变量”组中,滚动并查找 PATH 条目。
  3. 选择它并单击“编辑”
  4. 在现有条目的末尾,输入您的 PostgreSQL bin 目录的完整路径。 bin 文件夹应位于您的 PostgreSQL 安装目录的根目录中。
  5. 重新启动任何打开的命令提示符,或者为确保起见,重新启动计算机。

这应该可以解决任何问题。欲了解更多信息,请参见:


非常感谢您的帮助。请检查我帖子中的编辑部分。顺便说一下, 默认数据库路径是我的第一个问题,已经解决了,PDO驱动程序问题紧随其后。 - Hyperion
1
DLL文件存在于扩展文件夹中,对吧?另外,尝试取消注释另一个DLL:extension=php_pdo.dll 这是数据库特定驱动程序所依赖的主要PDO驱动程序。 - lainceline
请注意,对于使用Apache或其他Web服务器的用户,需要重新启动Apache才能使更改生效:sudo systemctl restart httpd.service - Mugoma J. Okomba
'default' => 'pgsql' not postgres - FooBar
该死的libpq.dll,你每次都让我犯错。 :D - Alexandre Martini
显示剩余11条评论

49

对于MySQLPDOException: could not find driver错误,如果是基于Debian的操作系统,

sudo apt-get -y install php5-mysql

8
如果您正在使用基于现代Debian操作系统的PostgreSQL,那么安装命令为 sudo apt-get -y install php7.0-pgsql。请注意,这是一条命令而不是解释。 - Ben Johnson

42

对于Ubuntu中的PHP 7,您也可以执行以下操作:

sudo apt-get install php7.0-pgsql

所以,现在你可以不用取消注释 php.ini 中的行。

更新: 我遇到了同样的错误,所以问题并非出在驱动程序上。 我更改了我的 database.ini,但每次还是会看到一个错误。 当我在 .env 中更改数据库配置时,错误就消失了。


这是在Ubuntu上为我工作的唯一方法(尝试取消注释php.ini中的行没有效果)。 - Ben Wilson
3
在我的情况下,可以使用 sudo apt-get install php7.1-pgsql 解决这个问题。 - Cesar Romero
在我的情况下,可以使用以下命令解决: sudo apt-get install php7.4-pgsql。谢谢。 - Mauro Lacerda

8
这对我有用:

这对我有用:

$ sudo apt-get install php-gd php-mysql

8

我知道这是一个老问题,但我在谷歌搜索中找到了它,所以我会回答一下,以防其他人遇到同样的问题。我使用的是Mac电脑,也遇到了同样的问题,但通过使用HomeBrew解决了它。安装好后,您只需运行此命令:

brew install php56-pdo-pgsql

请将56替换为您使用的PHP版本,不需要小数点。


7

我曾经遇到过同样的问题,以下是解决方法:

有两个php.ini文件:

  • C:\wamp\bin\apache\apache2.4.9\bin
  • C:\wamp\bin\php\php5.5.12

注意:这里使用的是我的PHP和Apache版本,你需要根据自己的情况进行更改。

你需要更新这两个文件夹中的php.ini文件,具体来说是以下扩展:

  • extension=php_pdo_pgsql.dll
  • extension=php_pgsql.dll

你需要将它们注释掉(删除分号;)。

重新启动Wamp和命令提示符。

希望这对你有帮助 :)


终于成功了!我在Windows 10 Wamp服务器上尝试了2个小时,问题是Wamp的选项只影响apache文件夹中的php.ini文件,而不是php文件夹中的文件。非常感谢! - Borjovsky

4

我也遇到了这个问题。我已经解决了这个问题。如果你正在使用Wamp,请按照以下步骤操作。

  1. 转到 wamp64/www/bin/php/php*(其中*是您正在使用的php版本)
  2. 编辑文件php并通过删除分号取消对此行的注释:
;extension=pdo_pgsql to extension=pdo_pgsql
  1. 保存并重新启动您的Wamp服务器

如果不起作用,请再次检查您的.env和config/database。


3
sudo apt-get install php7.1-pgsql

3

您应该在驱动程序的扩展名前删除注释。

默认情况下,驱动程序是未激活的,您需要自己激活它,之后它将正常工作。

希望这对您有所帮助。


3

我在使用 PHP 7.3.7 docker 和 Laravel 时遇到了同样的错误:

以下方法对我有效。

apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo pgsql pdo_pgsql

这将安装pgsql和pdo_pgsql驱动程序。

现在运行此命令,取消注释php.ini文件中的extension=pdo_pgsql.so和extension=pgsql.so行。

sed -ri -e 's!;extension=pdo_pgsql!extension=pdo_pgsql!' $PHP_INI_DIR/php.ini

sed -ri -e 's!;extension=pgsql!extension=pgsql!' $PHP_INI_DIR/php.ini

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