primo/pdo

卓越的PDO扩展,提高一致性、接口和日志记录

v0.9 2019-06-06 08:22 UTC

This package is auto-updated.

Last update: 2024-09-22 21:38:57 UTC


README

Software License Build Status GitHub issues Latest Version PHP from Travis config

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 ] );

另外

  1. 如果启用日志记录,查询将从绑定的变量重建

  2. 可以选择将PDOStatement作为子类或包装器。子类版本不支持持久连接。

  3. 自定义选项'数据库'使用在给定Phinx环境中提供的相同凭据连接到备用数据库(例如备份)。这还允许覆盖无数据库连接,即

 $pdo = new PDO( $aConfigEnvironment, ['database' => "" ]); // override, preferring no-database
  1. 用于解决数据库之间差异的辅助类
e.g. CONCAT (mysql) vs. || (sqlite)

辅助类提供了一个框架,用于在不同的地方之间复制数据库。

  • 从一个环境到基于相同环境的备份位置

  • 在相同数据库的不同环境之间

  • 在不同的数据库的不同环境之间(尚未编码)

您可以扩展辅助类,提供自己的实用程序,并通过在配置中添加'helper'选项来调用它们。