idct/database-comparator

1.0.0 2017-08-15 15:58 UTC

This package is auto-updated.

Last update: 2024-08-28 22:29:55 UTC


README

数据库比较的基本框架。允许报告两个数据源之间的差异。

特别适用于在应用程序中做出重大更改(如向任何数据源写入数据)并希望验证没有出现错误的情况。可以说,它允许编写简单的黑盒测试。

内容

框架目前提供以下内容

  • PdoSource:用于比较可以使用PDO作为连接器的数据库。
  • SourceInterface:用于编写新兼容数据源连接器的接口。
  • SimpleOutput:将差异写入文件的基本文本输出。
  • OutputInterface:用于构建新输出写入对象的接口。

使用方法

  1. 使用composer通过
composer require idct/database-comparator="^1.0"

或手动下载内容并将其放置在所需的文件夹中。

  1. 包含所有文件或自动加载器
include "vendor/autoload.php";
  1. 构建您的比较定义

假设您有一个具有模式的表

创建新对象

$comparator = new Compare();
$objects = new PdoSource();
$pdo = new PDO(...); //your database connection details here

如果您在同一数据库内进行比较,可以使用相同的连接器(相同的源)

$objects->setPdo($pdo)
        ->setQueryAll('select * from some_table limit :limit offset :offset') //limit and offset will be dynamically updated
        ->setQuerySingle('select * from some_table where {_keys}')
        ->setSingleKeys(['id']);

$comparator->addSource('main', $objects)
           ->addSource('test', $objects); /* in this case we shall use the same
           source as for left calls it will use queryAll and for right ones
           querySingle */

$output = (new SimpleOutput())
          ->setBaseFilename('somepath/comparison_{source}.log');
          // {source} token will be dynamically replaced

$comparator->setOutput($output)
           ->run();

//report differences
var_dump($comparator->getDiffsCount());
  1. 特殊情况

在某些情况下,您可能想省略一些字段——例如,如果您的表具有自动的“最后更新”字段。您可以通过两种方式来实现

  • 在查询中不指定它(例如 QueryAllQuerySingle)或如果很难做到(如SQL中您需要列出所有其他字段),设置“忽略字段”
$objects->setIgnoredFields(['last_updated']);

如果您的表/数据源具有复杂的数据源,只需在 setSingleKeys 中指定它们作为下一个数组元素,例如

$objects->setSingleKeys(['id','sub_id']);

框架最有趣的功能之一是在比较之前更改结果选项——这在您 知道 您已经更改了什么并且想要检查是否达到了预期效果的情况下非常有用。例如:如果您有一个向上述示例表填充数据的应用程序,并且您对应用程序进行了更改,导致 value 字段的数据减去2,您仍然可以使用 getSinglePreCheckTransformation 方法进行验证。

$objects->setSinglePreCheckTransformation(function($their, $mine) {
    $mine['value'] += 2;
    return $mine;
});

SinglePreCheckTransformation 的目的是更新当前数据源中的数据,并应返回更新后的集合。因此,如果您在每行/条目的 value 字段的值中减去2,您可以将2加回以使用上述代码进行比较。

贡献

如果您发现了任何错误、问题或想添加一些功能...或编写测试 :) 非常欢迎!请进行更改,添加一个拉取请求,我会在可能的时候合并它。提前感谢!