enjoys / swatdb
基于 PDO 的简单数据库包装器
1.8.0
2023-12-09 17:31 UTC
Requires
- php: ^8.0
- ext-json: *
- ext-pdo: *
- enjoys/functions: ^2.0
- enjoys/simple-cache: ^1.0
- enjoys/traits: ^1.0
- psr/log: >=1.0
Requires (Dev)
- monolog/monolog: ^2.2
- phpunit/phpunit: ^9.4
- squizlabs/php_codesniffer: ^3.0
README
基于 PDO 的简单数据库包装器
最初(很多年前)这是 DbSimple 库的一个分支 DbSimple,现在只剩下了用于自定义占位符的正则表达式。
一般(备注)
选择
select() 方法
这是 PDO::prepare 和 PDOStatement:execute 的包装
/** @var Enjoys\SwatDB\Wrapper $db */
$sth = $db->select("SELECT * FROM ..."); //return PDOStatement
//далее
$sth->fetchAll(); //и т.д.
装饰性选择方法
直接返回结果,而不是 PDOStatement
/** @var Enjoys\SwatDB\Wrapper $db */
$db->selectAll("SELECT * FROM ..."); //return array
$db->selectArr("SELECT id, name FROM ..."); //return array keypair id => name
$db->selectCell("SELECT COUNT(*) FROM ..."); //return int|string value
$db->selectCol("SELECT colname FROM ..."); //return array<int, string>
装饰性选择方法的缓存结果
如 selectAll()、selectArr()、selectCell()、selectCol()、selectRow()
use Enjoys\SimpleCache\Cacher;
$db = Enjoys\SwatDB\DB::connect([
'dsn' => 'sqlite:memory',
//Любой cacher реализующий интерфейс Psr\SimpleCache\CacheInterface
'cacher' => new Cacher\Memcached()
]);
//Альтернативная установка cacher
$db->setCacher(new Cacher\FileCache());
$db->selectAll(300, "SELECT * FROM ..."); //кэширование на 5 минут
//аналогично и на другие методы
插入
插入一行
/** @var Enjoys\SwatDB\Wrapper $db */
$db->insert('table_name', ['column' => 'value', ...]); //Returns the number of rows affected
MySQL:插入行,同时使用 ON DUPLICATE KEY UPDATE(UPSERT)的简单版本
/** @var Enjoys\SwatDB\Wrapper $db */
//INSERT INTO table_name SET (`column`, ...) VALUE ('value', ...) ON DUPLICATE KEY UPDATE column = ?, ...
$db->upsert('table_name', ['column' => 'value', ...]); //Returns the number of rows affected
SQLite:ON CONFLICT(x) DO UPDATE SET(最简单版本)唯一条件是数据数组中第一个应该是键或 PRIMARY 或 UNIQUE
/** @var Enjoys\SwatDB\Wrapper $db */
//INSERT INTO table_name SET (`column`, ...) VALUE ('value', ...) ON CONFLICT(`column`) DO UPDATE SET column = ?, ...
$db->upsert('table_name', ['column' => 'value', ...]); //Returns the number of rows affected
插入多行 INSERT INTO table (column, ...) VALUES (value1, ...), (value2, ...)
/** @var Enjoys\SwatDB\Wrapper $db */
$db->insertMulti('table_name', ['column1', ...], [['value1', ...], ['value2', ...]]); //Returns the number of rows affected
$columns = ['name', 'email'];
$values = [
['Вася', 'vasya@example.com'],
['Федя', 'fedya@example.com'],
];
//INSERT INTO table_name (name, email) VALUES ('Вася', 'vasya@example.com'), (Федя', 'fedya@example.com')
$cnt = $db->insertMulti('table_name', $columns, $values); //$cnt = 2
/** @var Enjoys\SwatDB\Wrapper $db */
//$db->replace(); in future versions
更新
可以通过 update() 方法调用简单的 UPDATE 场景
UPDATE table SET ... WHERE ...
/** @var Enjoys\SwatDB\Wrapper $db */
//SQL: UPDATE table_name SET 'mycolumn' = `updated` WHERE `id` = 1
$db->update('table_name', ['mycolumn' => 'updated'], 'id = ?d', 1); //Returns the number of rows affected
删除
可以通过 delete() 方法调用简单的 DELETE 场景
/** @var Enjoys\SwatDB\Wrapper $db */
//DELETE FROM table WHERE ...
$db->delete('table_name', 'id = ?d', 10); //Returns the number of rows affected
截断
/** @var Enjoys\SwatDB\Wrapper $db */
//DELETE FROM table WHERE ...
$db->truncate('table_name'); //Work in MySQL, SQLite
创建、删除等,等等
目前尚未实现,所有这些都在计划中,现在最好使用 exec 来实现这些目的
/** @var Enjoys\SwatDB\Wrapper $db */
//$db->create(); //TODO
//$db->drop(); //TODO
//$db->truncate(); //TODO