behance/nbd.php-dbal

此包已被废弃且不再维护。未建议替代包。

Behance 数据库访问层

2.2.1 2018-07-17 14:59 UTC

README

Build Status Dependency Status

behance/nbd.php-dbal

数据库适配器有成千上万种。但很少有适配器能完全符合(我们非常具体的)要求。

目标

  1. 非常少的依赖,适用于各种不同的环境。
  2. 尽量屏蔽连接和管理逻辑,以保护实现者。
  3. 支持主从复制模式。
  4. 半智能的连接选择。
  5. 支持 CRUD 操作、访问器和回退到原生 SQL(也与其他 SQL 生成器兼容)。
    • 自动将便捷参数转换为预编译语句。
  6. 在长时间运行的 crons、workers、scripts 中自动重试 "mysql gone away"。
  7. 通过事件提供深度内省。

用法

use Behance\NBD\Dbal;

$config['master'] = [
    'username' => 'admin',
    'password' => 'password',
    'host'     => 'db',
    'port'     => 3306,
    'database' => 'dbal_test',
    'driver'   => 'Pdo_Mysql'
];

$config['replicas'] = [
    [
        'username' => 'admin',
        'password' => 'password',
        'host'     => 'replica',
        'port'     => 3306,
        'database' => 'dbal_test',
        'driver'   => 'Pdo_Mysql'
    ],
    //[
    //    ...add as many slaves as necessary
    //]
];

$db = Dbal\Factory::create( $config );

测试

单元测试

  1. composer install
  2. ./vendor/bin/phpunit

集成测试:利用 Docker,使用实际的 mysql 容器

  1. docker-compose up -d
  2. docker exec -it nbdphpdbal_web_1 /bin/bash
  3. cd /app
  4. ./vendor/bin/phpunit

操作

操作 示例 结果 备注
插入 $adapter->insert( 'table', [ 'key' => 'value' ] ); 最后插入 ID
插入忽略 $adapter->insertIgnore( 'table', [ 'key' => 'value' ] ); 最后插入 ID,未插入则为 false
插入时更新重复键值 $adapter->insertOnDuplicateUpdate( 'table', [ 'key' => 'value' ], [ 'created_on' => new Sql( 'NOW()' ) ] ); 最后插入 ID,否则为更新时的 2 *请参见 WHERE 使用
更新 $adapter->update( 'table', [ 'key' => 'new_value' ] ); 影响的行数 *请参见 WHERE 使用,强制要求非空的 WHERE 条件
删除 $adapter->delete( 'table', [ 'id' => 12345 ] ); 影响的行数 *请参见 WHERE 使用,强制要求非空的 WHERE 条件
beginTransaction $adapter->beginTransaction(); bool 成功 不支持嵌套事务
commit $adapter->commit(); bool 成功
rollBack $adapter->rollBack(); bool 成功
queryTable $adapter->queryTable( ‘table’, "SELECT * FROM `table` WHERE id=? AND enabled=?", [ 12345, 0 ] ); PDOStatement *PDOStatement 已执行
queryTableMaster $adapter->queryTableMaster( ‘table’, "SELECT * FROM `table` WHERE id=:id AND enabled=:enabled, [ ':id' => 12345, ':enabled' => 0 ] ); PDOStatement *PDOStatement 已执行,使用主连接进行额外的 `table` 查询
query 适配器->查询( "SELECT * FROM `table` WHERE id=? AND enabled=?", [ 12345, 0 ] ); PDOStatement *PDOStatement 已执行
查询主数据库 $adapter->queryMaster( "SELECT * FROM `table` WHERE id=:id AND enabled=:enabled, [ ':id' => 12345, ':enabled' => 0 ] ); PDOStatement *PDOStatement 已执行
查询主数据库 $adapter->queryMaster( "SELECT * FROM `table` WHERE id=:id AND enabled=:enabled, [ ':id' => 12345, ':enabled' => 0 ] ); PDOStatement *PDOStatement 已执行,主连接将用于所有未来的查询
转义字符 $adapter->queryMaster( "SELECT * FROM `table` WHERE id=:id AND enabled=:enabled, [ ':id' => 12345, ':enabled' => 0 ] ); 字符串 参数化语句