small / swoole-db
此包提供了操作 OpenSwoole 表的高级功能
Requires
- php: >=8.3
- small/collection: >=2.1.0
Requires (Dev)
- openswoole/ide-helper: *
- phpstan/phpstan: 1.10.*
- phpunit/phpunit: 10.4.*
README
此包提供了操作 OpenSwoole.Table 的高级功能
OpenSwoole.Table 的主要优势是快速访问:你可以在一秒钟内读取大约 200 万条记录,并且它可以在进程之间共享。
此包旨在使你能够轻松管理 OpenSwoole.Table。
注册表
表注册
表注册是访问 small-swoole-db 的入口点
你可以
- 在内存中创建一个表并注册它
- 获取已注册的表
- 销毁内存中的表
- 将表持久化到
- JSON 文件
- Redis
- Mysql
- 加载先前持久化的表
创建表
要创建表,使用注册方法
use \Small\SwooleDb\Registry\TableRegistry;
$testTable = TableRegistry::getInstance()->createTable('testTable', 128);
- 第一个参数是注册表中的表名。使用它从代码的其他部分调用表。
- 第二个参数是表中的最大行数
一旦表在注册表中创建,你就可以添加列
只接受这些类型
- ColumnType::string
- ColumnType::float
- ColumnType::int
注意 size 参数是必需的,除了 float 类型
use \Small\SwooleDb\Registry\TableRegistry;
use \Small\SwooleDb\Core\Column;
use \Small\SwooleDb\Core\Enum\ColumnType;
TableRegistry::getInstance()->getTable('testTable')
->addColumn(new Column('firstname', ColumnType::string, 256))
->addColumn(new Column('credit', ColumnType::float))
->addColumn(new Column('rank', ColumnType::int, 8))
现在我们已经添加了列,我们可以在内存中创建
use \Small\SwooleDb\Registry\TableRegistry;
$success = TableRegistry::getInstance()->getTable('testTable')->create();
该表现在可以作为 OpenSwoole.Table 对象使用
use \Small\SwooleDb\Registry\TableRegistry;
$table = TableRegistry::getInstance()->getTable('testTable')
$table->set(0, ['franck', 12.5, 11]);
$table->set(1, ['joe', 55.2, 26]);
外键
你可以通过外键链接两个表。
use Small\SwooleDb\Registry\TableRegistry;
$table = TableRegistry::getInstance()->createTable('testSelectJoin', 5);
$table->addColumn(new Column('name', ColumnType::string, 255));
$table->addColumn(new Column('price', ColumnType::float));
$table->create();
$table->set(0, ['name' => 'john', 'price' => 12.5]);
$table->set(1, ['name' => 'paul', 'price' => 34.9]);
$table2 = TableRegistry::getInstance()->createTable('testSelectJoinPost', 5);
$table2->addColumn(new Column('message', ColumnType::string, 255));
$table2->addColumn(new Column('ownerId', ColumnType::int, 16));
$table2->create();
$table2->set(0, ['message' => 'ceci est un test', 'ownerId' => 0]);
$table2->set(1, ['message' => 'ceci est un autre test', 'ownerId' => 1]);
$table2->set(2, ['message' => 'ceci est une suite de test', 'ownerId' => 1]);
$table2->addForeignKey('messageOwner', 'testSelectJoin', 'ownerId');
销毁表
一旦你不再需要表,你可以销毁它以释放所有相关内存。
use \Small\SwooleDb\Registry\TableRegistry;
$table = TableRegistry::getInstance()->destroy('testTable');
这将销毁表并将其从注册表中删除
持久化
当你需要表的持久化时,你可以将表存储到 JSON 文件中。
不久,我将开发 redis 和 mysql 持久化,但现在请使用默认的持久化
use \Small\SwooleDb\Registry\TableRegistry;
TableRegistry::getInstance()->persist('testTable');
这将把表定义存储在 /var/lib/small-swoole-db/data/testTable.json 中的 JSON 文件中
要从磁盘重新加载表(例如在服务器重启时)
use \Small\SwooleDb\Registry\TableRegistry;
TableRegistry::getInstance()->loadFromChannel('testTable');
这将从上次持久化中恢复注册表和内存中的表,包括所有数据
ParamRegistry
如果你想,你可以使用 ParamRegistry 来更改
- /var/lib 目录的位置
use Small\SwooleDb\Registry\ParamRegistry; use Small\SwooleDb\Registry\Enum\ParamType;
ParamRegistry::getInstance()->set(ParamType::varLibDir, '/home/some-user');
- data dir name :
use Small\SwooleDb\Registry\ParamRegistry; use Small\SwooleDb\Registry\Enum\ParamType;
ParamRegistry::getInstance()->set(ParamType::dataDirName, 'persistence');
In this example, the testTable table will be stored in :
/home/some-user/testTable.json
### Selector
You can use selector to build complex requests.
Basically, you can select all records :
use Small\SwooleDb\Selector\TableSelector;
$selector = new TableSelector('testSelect'); $records = $selector->execute();
foreach ($records as $record) {
echo $record['testSelect']->getValue('name');
}
You can use *where* to add conditions :
use Small\SwooleDb\Selector\TableSelector; use Small\SwooleDb\Selector\Enum\ConditionElementType; use Small\SwooleDb\Selector\Enum\ConditionOperator;
$selector = new TableSelector('testSelect'); $selector->where()
->firstCondition(new Condition(
new ConditionElement(ConditionElementType::var, 'price', 'testSelect'),
ConditionOperator::superior,
new ConditionElement(ConditionElementType::const, 15)
));
$records = $selector->execute();
foreach ($records as $record) {
echo $record['testSelect']->getValue('name');
}
You can also join result throw foreign keys :
use Small\SwooleDb\Selector\TableSelector;
$result = (new TableSelector('user'))
->join('post', 'messageOwner', 'message')
->execute()
foreach ($result as $record) {
echo $record['message']->getValue('body') . ' : by ' . $record['user']->getValue('name');
}
And select any of fields (note that you can change record and persist easily) :
use Small\SwooleDb\Selector\TableSelector; use Small\SwooleDb\Selector\Enum\ConditionElementType; use Small\SwooleDb\Selector\Enum\ConditionOperator;
$selector = (new TableSelector('user'))
->join('post', 'messageOwner', 'message')
;
$selector->where()
->firstCondition(new Condition(
new ConditionElement(ConditionElementType::var, 'name', 'user'),
ConditionOperator::equal,
new ConditionElement(ConditionElementType::const, 'john')
))->andCondition(new Condition(
new ConditionElement(ConditionElementType::var, 'subject', 'message'),
ConditionOperator::like,
new ConditionElement(ConditionElementType::const, '%hiring%')
))
;
$result = $selector->execute();
foreach ($result as $record) {
echo $record['message']->getValue('body') . ' : by ' . $record['user']->getValue('name');
$record['message']
->setValue('read', 1)
->persist()
;
}
## Testing
You must have docker installed to run tests.
To build unit-test container and run test suite, use command :
$ bin/test --build
Once the container is build, you can quickly run test using :
$ bin/test