Laravel 使用 PostgreSQL 数据库需要注意的点

首先安装 PostgreSQL

1.你本地是什么开发环境?

  • 如果你的开发环境是 Homestead,那么恭喜你,不需要安装,直接使用。
    • 数据库账号:homestead
    • 数据库密码:secert
  • 如果你的开发环境是集成的,或者自己搭建的环境,需要另行下载 PostgreSQL。安装过程很简单,按提示一步步走,不会的可参考菜鸟教程中 PostgreSQL 安装 WindowsMac。最后需要设置并记住你数据库的密码。默认账号是:postgres 密码是:*你设置的密码*
    • 官网地址:Download
    • EnterpriseDB 地址:Download (EnterpriseDB 是全球唯一一家提供基于 PostgreSQL 企业级产品与服务的厂商。)

2. 其次要看 PHP 支持的 pdo_pgsql 支持的 libpq 版本。

scram-sha-256是PostgreSQL 10中新增的基于SASL的认证方式,是PostgreSQL目前提供的最安全的认证方式。使用scram-sha-256认证方式不支持旧版本的客户端库。如果使用PostgreSQL 10以前的客户端库连接数据库,会有如下错误:
SCRAM authentication requires libpq version 10 or above

  • 根据上面提示,注意你选择下载安装的 PostgreSQL 版本,它与你的 PHP 对应的 pdo_pgsql 扩展的 libpq 版本有关,他是链接数据库的客户端扩展。如果你的下载的 PostgreSQL 版本高,但是 PHP 扩展的 libpq 版本低,就会出现这个错误:SCRAM authentication requires libpq version 10 or above

  • 现在开启你 PHP 的 pdo_pgsqlpgsql 扩展,如果没有此扩展,去下载编译,具体过程我不再赘述。然后通过输出 phpinfo()函数,然后查看 PHP 对应的 libpq 的版本,PostgreSQL 版本大于10 的话,需要 PHP 扩展 libpq 的版本至少大于 10:
    Laravel 使用 PostgreSQL 数据库遇到的一些坑!

使用 Navicat 数据连接工具测试连接

  1. 虚拟主机中的 Homestead 开发环境连接 PostgreSQL:
    Laravel 使用 PostgreSQL 数据库遇到的一些坑!

  2. 本地集成开发环境连接 PostgreSQL:
    Laravel 使用 PostgreSQL 数据库遇到的一些坑!

配置 Laravel 的 .env 文件需要注意的:

  1. homestead 的 Laravel 框架的配置:
    DB_CONNECTION=pgsql 
    DB_HOST=127.0.0.1 
    DB_PORT=5432    //  因为代码是在虚拟主机中,无需使用映射到主机上的端口,5432 即可。
    DB_DATABASE=psbc 
    DB_USERNAME=homestead 
    DB_PASSWORD=secert 
  2. 本地开发环境的 Laravel 框架的配置::
    DB_CONNECTION=pgsql
    DB_HOST=127.0.0.1
    DB_PORT=5432
    DB_DATABASE=psbc
    DB_USERNAME=postgres
    DB_PASSWORD=root

迁移文件需要注意的点:

1. boolean 类型的使用。

类型 boolean tinyint(1) MySQL 官方文档指出目前不支持 boolean 类型,需要使用的话用 tinyint(1) 代替。如果你定义了布尔类型,它会自动给你转换成 tinyint。 BOOL,BOOLEAN是 tinyint(1) 的同义词。

  • 迁移文件内容如下:

    public function up()
    {
      Schema::table('ttx_staff', function (Blueprint $table) {
          // 新增一个员工的状态字段
          $table->boolean('status')->default(1)>after('article_num')->comment('用户状态');
      });
    }
  • 像上面的的迁移文件中 boolean 方法,在执行迁移命令后:

    • PostgreSQL 数据库表中生成的是 boolean 类型的 status 字段。
      Laravel 使用 PostgreSQL 数据库遇到的一些坑!
    • mysql 数据库表中生成的是 tinyint 类型的 status 字段。
      Laravel 使用 PostgreSQL 数据库遇到的一些坑!
  • 也就是说 PostgreSQL 支持标准的 boolean 类型,MySQL 是不直接支持的,它是变相的支持。有关更多 PostgreSQL 支持的类型,请查看 PostgreSQL 数据类型
    Laravel 使用 PostgreSQL 数据库遇到的一些坑!
    Laravel 使用 PostgreSQL 数据库遇到的一些坑!

  • 在这里还有一个需要注意,after() 方法在 PostgreSQL 数据库表中是不能用的,因为 PostgreSQL 数据库本身不支持表字段移动位置。但是 MySQL 是可以的。

2. char 类型的使用。

  • 迁移文件内容如下:

    Schema::create('ttx_config', function(Blueprint $table)
    {    
          // 看这个 key 字段的类型,它在 MySQL 和 PostgreSQL 中是有区别的
          // char 不给长度,Laravel 默认给字符串长度为 255
          $table->char('key')->comment('配置名');
          $table->text('val', 65535)->nullable()->comment('配置值');
    });
  • 如果是 MySQL 生成的表字段,它的字段类型是 char
    Laravel 使用 PostgreSQL 数据库遇到的一些坑!

  • 如果你的 PostgreSQL 生成的表字段,它的类型也是 char
    Laravel 使用 PostgreSQL 数据库遇到的一些坑!

  • 说道这里是不是感觉没什么差别,请继续往下看你就明白了。

    • 我在 tinker 中执行一个数据库查询
    • 使用 PostgreSQL:
      Laravel 使用 PostgreSQL 数据库遇到的一些坑!
    • 使用 MySQL:
      Laravel 使用 PostgreSQL 数据库遇到的一些坑!
  • 以上两点是我已知的Laravel 配合 PostgreSQL 或配合 MySQL 在迁移文件中使用出现不同的点。虽然不多,但都坑了我不少时间。如果你们发现有更多不同点,可以在文章下方留言讨论。

数据查询需要注意的点:

1. LIMIT 的使用:

  • PostgreSQL 不能使用 LIMIT 初始位置,记录数 这种方式查询。

    • 正确的:
      DB::SELECT("SELECT * FROM ttx_config LIMIT 1 OFFSET 2")
    • 错误的:
      DB::SELECT("SELECT * FROM ttx_config LIMIT 2, 1")
      Laravel 使用 PostgreSQL 数据库遇到的一些坑!
  • 以上两种方式的 LIMIT 查询,MySQL 都支持。

2. `` 符号的使用:

  • PostgreSQL 不能使用 `` 这种符号。

    • 正确的:
      DB::SELECT("SELECT * FROM ttx_config LIMIT 1 OFFSET 2")
    • 错误的:
      DB::SELECT("SELECT * FROM `ttx_config` LIMIT 2, 1")
      Laravel 使用 PostgreSQL 数据库遇到的一些坑!
  • 以上两种方式的查询,MySQL 都支持。

3. IFNULL 函数的使用:

  • PostgreSQL 没有 IFNULL 这个函数。取而代之的是 COALESCE(字段,默认值) 这个函数。

  • MySQL 支持 IFNULL 函数。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Xiao Peng
laravel_peng
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!