我无法使用Laravel连接到Postgresql

问题描述

我在将Largre 7.24.0与Postgresql 12.3结合使用时遇到问题 这是我收到的错误消息:

Illuminate\Database\QueryException
Could not find driver (sql: insert into "posts" ("title","content","updated_at","created_at") values (aze,bcb,2020-08-11 18:02:26,2020-08-11 18:02:26) returning "id") 

这是我的设置(我使用DBeaver和命令行测试了设置(主机,端口,用户名密码和db_name):

.env:

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=<db_name>
DB_USERNAME=<user_name>
DB_PASSWORD=<password>

database.PHP

    'default' => env('DB_CONNECTION','pgsql'),...
    'connections' => [
        'pgsql' => [
            'driver' => 'pgsql','url' => env('DATABASE_URL'),'host' => env('DB_HOST','127.0.0.1'),'port' => env('DB_PORT','5432'),'database' => env('DB_DATABASE','<db_name>'),'username' => env('DB_USERNAME','<user_name>'),'password' => env('DB_PASSWORD','<password>'),'charset' => 'utf8','prefix' => '','prefix_indexes' => true,'schema' => 'public','sslmode' => 'prefer',],

这是我尝试过的:

  1. composer require doctrine/dbal
  2. 编辑/etc/PHP/7.4/apache2/PHP.ini并取消注释extension=pdo_pgsqlextension=pgsql
  3. apt-get install PHP-pgsql && sudo systemctl restart apache2
  4. 由于字段名称周围的双引号而不是值使我感到困惑,因此我执行了原始SQL查询以确保语法正确(我使用DBeaver对其进行了测试)。
$sqlQuery = "insert into posts 
             (title,post,updated_at,created_at) values
             ('aze','bcb','2020-08-11 17:10:47','2020-08-11 17:10:48') returning id";
$result = DB::select(DB::raw($sqlQuery));
  1. 我先运行PHP artisan tinker,然后在命令行上运行DB::connection()->getPdo();,并得到了以下结果:
=> Doctrine\DBAL\Driver\PDOConnection {#3085
     inTransaction: false,attributes: {
       CASE: NATURAL,ERRMODE: EXCEPTION,PERSISTENT: false,DRIVER_NAME: "pgsql",SERVER_INFO: "PID: 27281; Client Encoding: UTF8; Is Superuser: off; Session Authorization: mespas; Date Style: ISO,DMY",ORACLE_NULLS: NATURAL,CLIENT_VERSION: "10.12 (Ubuntu 10.12-0ubuntu0.18.04.1)",SERVER_VERSION: "12.3 (Ubuntu 12.3-1.pgdg18.04+1)",STATEMENT_CLASS: [
         "Doctrine\DBAL\Driver\PDOStatement",[],EMULATE_PREPARES: false,CONNECTION_STATUS: "Connection OK; waiting to send.",DEFAULT_FETCH_MODE: BOTH,},}

显然我应该得到什么

  1. 由于未定义,我从database.PHP删除了DATABASE_URL。我认为是否已设置所有其他参数,则没有必要。

我不断收到相同的信息,经过几个小时的研究,我有点没主意...

解决方法

好的,所以按照@nibnut的建议,我去掉了Apache的php 7.2并启用了7.4 当我在查看它时,我检查了CLI版本并收到以下消息:

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_pgsql' (tried: /usr/lib/php/20190902/pdo_pgsql (/usr/lib/php/20190902/pdo_pgsql: cannot open shared object file: No such file or directory),/usr/lib/php/20190902/pdo_pgsql.so (/usr/lib/php/20190902/pdo_pgsql.so: undefined symbol: pdo_parse_params)) in Unknown on line 0

对于那些感兴趣的人,我发现了如何安装它here

现在可以正常工作,并且我的数据已保存在数据库中,即使很奇怪,我在运行php -v时仍然收到消息

感谢@nibnut的帮助!