Laravel 使用 PostgreSQL 数据库需要注意的点
首先安装 PostgreSQL
1.你本地是什么开发环境?
- 如果你的开发环境是
Homestead
,那么恭喜你,不需要安装,直接使用。- 数据库账号:
homestead
- 数据库密码:
secert
- 数据库账号:
- 如果你的开发环境是集成的,或者自己搭建的环境,需要另行下载
PostgreSQL
。安装过程很简单,按提示一步步走,不会的可参考菜鸟教程中 PostgreSQL 安装 Windows 和 Mac。最后需要设置并记住你数据库的密码。默认账号是:postgres
密码是:*你设置的密码*
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_pgsql
或pgsql
扩展,如果没有此扩展,去下载编译,具体过程我不再赘述。然后通过输出phpinfo()
函数,然后查看 PHP 对应的libpq
的版本,PostgreSQL 版本大于10 的话,需要 PHP 扩展libpq
的版本至少大于 10:
使用 Navicat 数据连接工具测试连接
虚拟主机中的 Homestead 开发环境连接 PostgreSQL:
本地集成开发环境连接 PostgreSQL:
配置 Laravel 的 .env
文件需要注意的:
- homestead 的 Laravel 框架的配置:
DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 // 因为代码是在虚拟主机中,无需使用映射到主机上的端口,5432 即可。 DB_DATABASE=psbc DB_USERNAME=homestead DB_PASSWORD=secert
- 本地开发环境的 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
字段。 - mysql 数据库表中生成的是
tinyint
类型的status
字段。
- PostgreSQL 数据库表中生成的是
也就是说 PostgreSQL 支持标准的
boolean
类型,MySQL 是不直接支持的,它是变相的支持。有关更多 PostgreSQL 支持的类型,请查看 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
。如果你的 PostgreSQL 生成的表字段,它的类型也是
char
。说道这里是不是感觉没什么差别,请继续往下看你就明白了。
- 我在
tinker
中执行一个数据库查询 - 使用 PostgreSQL:
- 使用 MySQL:
- 我在
以上两点是我已知的
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")
- 正确的:
以上两种方式的 LIMIT 查询,MySQL 都支持。
2. `` 符号的使用:
PostgreSQL 不能使用 `` 这种符号。
- 正确的:
DB::SELECT("SELECT * FROM ttx_config LIMIT 1 OFFSET 2")
- 错误的:
DB::SELECT("SELECT * FROM `ttx_config` LIMIT 2, 1")
- 正确的:
以上两种方式的查询,MySQL 都支持。
3. IFNULL 函数的使用:
PostgreSQL 没有
IFNULL
这个函数。取而代之的是COALESCE(字段,默认值)
这个函数。MySQL 支持
IFNULL
函数。
本作品采用《CC 协议》,转载必须注明作者和本文链接