primo / pdo
卓越的PDO扩展,提高一致性、接口和日志记录
Requires (Dev)
- fzaninotto/faker: ^1.8
- robmorgan/phinx: ^0.10.7
This package is auto-updated.
Last update: 2024-09-22 21:38:57 UTC
README
primo-pdo-php
使用Phinx添加的酷炫功能
https://github.com/keithy/primo-pdo-php/wiki/ConfigReader-returns-an-Environment
主要目标
提供一个PDO接口,可以互换使用Sqlite和Mysql,以便针对快速基于文件的SQLite测试用例进行规格/单元测试/验收测试。
PDO实例化使用Phinx兼容的环境配置,而不是常规的“dsn”。Phinx配置文件支持多个'环境'和附加选项,包括:指定命名测试用例、迁移、日志配置和备份位置。
可以使用Phinx提供迁移和数据种子为测试用例和产品升级。该库包括从迁移创建数据库、快照/备份以及从快照创建测试用例的支持。
次要目标
包含其他类似库中最好且最简洁的特性。
#example:
$pdo->run("SELECT * FROM {$table} WHERE id = ? OR name = ?", $id, $name);
汇总所有可用的最佳知识(例如https://phpdelusions.net/pdo)
第三个目标
日志记录作为标准,向多个目标写入,具有合理的默认值,在禁用时无开销
特性
统一的DSN字符串接口
为了提高不同数据库和Phinx之间的一致性,我们除了接受标准的dsn,还接受值数组。
数组提供了Phinx工具使用的'适配器'、'主机'、'名称'、'字符集'、'用户'和'密码'。
如果机密信息在文件中(例如,Docker机密),我们还可以接受'user_file'和'pass_file'。
(已向Phinx建议此改进)
内置日志记录(未启用时无开销)
默认回调将重建的SQL查询写入error_log。
可以在配置文件中启用/禁用,全局(顶级),或按环境。
logging = false
可以在配置中设置为可调用的类。
logging = "\Primo\PDOLog\Logs"
在运行时注册额外的回调,如你所愿。
usage:
$pdo = new PDO( $aPhinxEnvironment )->addLog(false); // disables logging
$pdo2 = new PDO( $aPhinxEnvironment )->addLog( fn($sql) => error_log($sql) );
查询和预处理语句的超级统一接口
通过run()
方法 - 添加了splat运算符的好处!
预处理语句不能比这更容易了!
$pdo->run("SELECT * FROM {$table} WHERE id = ? OR name = ?", $id, $name);
#simple query
$pdo->run("SELECT name FROM pragma_table_info( '{$table}' )")->fetchAllAsColumn();
#prepared statement with named parameters
$pdo->run("SELECT * FROM {$table} WHERE id = :id OR name = :name", [ ':id' => $id, ':name' => $name ] );
$pdo->run("SELECT * FROM {$table} WHERE id = :id OR name = :name", [ 'id' => $id, 'name' => $name ] );
另外
-
如果启用日志记录,查询将从绑定的变量重建
-
可以选择将
PDOStatement
作为子类或包装器。子类版本不支持持久连接。 -
自定义选项'数据库'使用在给定Phinx环境中提供的相同凭据连接到备用数据库(例如备份)。这还允许覆盖无数据库连接,即
$pdo = new PDO( $aConfigEnvironment, ['database' => "" ]); // override, preferring no-database
- 用于解决数据库之间差异的辅助类
e.g. CONCAT (mysql) vs. || (sqlite)
辅助类提供了一个框架,用于在不同的地方之间复制数据库。
-
从一个环境到基于相同环境的备份位置
-
在相同数据库的不同环境之间
-
在不同的数据库的不同环境之间(尚未编码)
您可以扩展辅助类,提供自己的实用程序,并通过在配置中添加'helper'选项来调用它们。