behance / nbd.php-dbal
此包已被废弃且不再维护。未建议替代包。
Behance 数据库访问层
2.2.1
2018-07-17 14:59 UTC
Requires
- php: >=7.1
- symfony/event-dispatcher: ~2.6 || ~3.0
Requires (Dev)
- jimbojsb/pseudo: dev-feature/improve-prepared-statements
- phpunit/phpunit: ~6.0
README
behance/nbd.php-dbal
数据库适配器有成千上万种。但很少有适配器能完全符合(我们非常具体的)要求。
目标
- 非常少的依赖,适用于各种不同的环境。
- 尽量屏蔽连接和管理逻辑,以保护实现者。
- 支持主从复制模式。
- 半智能的连接选择。
- 写入操作自动选择主连接。
- 读取查询随机选择一个副本连接,除非...
- 在生命周期中的任何时刻选择主连接,都将始终使用该连接。
- 松散遵循 Doctrine 的原则 @see http://www.doctrine-project.org/api/dbal/2.0/class-Doctrine.DBAL.Connections.MasterSlaveConnection.html
- [新增] 当连接检索包含表时,主连接规则按表分段,未指定时自动回退。
- 支持 CRUD 操作、访问器和回退到原生 SQL(也与其他 SQL 生成器兼容)。
- 自动将便捷参数转换为预编译语句。
- 在长时间运行的 crons、workers、scripts 中自动重试 "mysql gone away"。
- 通过事件提供深度内省。
用法
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 );
测试
单元测试
composer install
./vendor/bin/phpunit
集成测试:利用 Docker,使用实际的 mysql 容器
docker-compose up -d
docker exec -it nbdphpdbal_web_1 /bin/bash
cd /app
./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 ] ); | 字符串 | 参数化语句 |