small/swoole-db

此包提供了操作 OpenSwoole 表的高级功能

1.3.2 2024-09-06 15:53 UTC

This package is auto-updated.

Last update: 2024-09-06 15:53:40 UTC


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');

参见OpenSwoole 文档中的 Table

销毁表

一旦你不再需要表,你可以销毁它以释放所有相关内存。

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