borislav / clickhouse
PHP项目的ClickHouse实现
Requires
- ramsey/uuid-doctrine: ^1.8
- smi2/phpclickhouse: ^1.4
- symfony/serializer: *
README
-
实体/Entity
-
每个实体 = 单独的表
-
实体名称 = inTheLowerCase(表名)
-
实体属性名称 = 列名
-
每个通过ClickHouse工作的实体必须实现接口ClickHouseEntityInterface(用于规范化和解规范化)。
-
-
存储库/Repository
- 每个存储库必须继承自ClickHouseRepository(是基本存储库,具有默认功能),并且存储库接口也必须从ClickHouseRepositoryInterface继承。
- (也许)基本/抽象存储库构造函数接受3个参数:
normalizer, denormalizer, entityClass
。如果在写入过程中出现错误,可能需要更改数据格式或检查实体在规范化形式下的外观是否正确,以及它是否正确映射到表上。如果需要,请查看ClickHouseEntityNormalizer。
-
客户端/适配器
-
适配器模式,通过接口实现与ClickHouse的交互,具有select、insert、query和ping方法。直接实现访问ClickHouse的HTTP接口。
-
!!!重要:在代码中,我们必须使用接口而不是实现(即适配器类的类型)来关闭,以便能够替换实现。
-
!!!重要:特别是,ClickHouseClientAdapter实现了方法
query
,该方法以第三个参数(isAwaitableQuery
)接受布尔值,如果为真,则向请求添加唯一键并返回结果实例ClickHouseSyncResponse(关于Response|SyncResponse的更多信息见下一条#4)。
-
-
响应/Response
从除了
ping
方法以外的任何适配器方法中,我们都会得到一个ClickHouseResponse或ClickHouseSyncResponse实例。- ClickHouseSyncResponse是对Statement类的包装,实现等待请求的额外功能(在ClickHouse中,ALTER TABLE t DELETE|UPDATE操作在后台执行,即操作并未完全完成,但响应已经到来)。该类允许您通过
await
和isDone
方法显式等待响应和数据的固定。await
- 等待请求完成,最多循环10分钟(通过参数配置)。isDone
- 单次检查,不循环,当等待固定+执行某些附加处理时很有用。
- ClickHouseResponse - ClickHouse响应的简单包装器,是ClickHouseSyncResponse的父类(建议使用
isSyncable
方法来确定实例是否可同步)。简单的代理类,用于隐藏实现。
- ClickHouseSyncResponse是对Statement类的包装,实现等待请求的额外功能(在ClickHouse中,ALTER TABLE t DELETE|UPDATE操作在后台执行,即操作并未完全完成,但响应已经到来)。该类允许您通过
-
混合/特性
-
ClickHouseClientTrait - 允许获取用于操作ClickHouse的上述适配器的唯一功能。
-
使用特性要求
- 使用特性的类必须实现接口ClickHouseClientTraitInterface,否则会抛出相应的异常。
-
-
迁移/Migration
- 必须实现接口ClickHouseMigrationInterface并明确使用上述特性(
$this->clickhouse()->(select|insert|query|ping)(...);
)。
- 必须实现接口ClickHouseMigrationInterface并明确使用上述特性(
-
测试/Test
-
如果测试需要与ClickHouse交互,则需要从ClickHouseSetupTestCase继承,然后根据需要显式地通过特性或通过EntityManager在任何测试中获取仓库。
-
!!!重要: 如果您重写了
setUp
或tearDown
方法,则需要调用父方法(parent::(tearDown|setUp)();
),或者在ClickHouse的测试数据库中明确清除表($this->clearTables();
)。!!!重要: 如果您在非测试环境中尝试使用此方法,则不会清除表并抛出异常。 -
目前,对于与ClickHouse交互的实体,无法创建固定值(将来可能会实现此功能)。可以通过在测试中创建单独的方法来显式实现数据的加载。
-
-
异常/Exception
- 所有在操作ClickHouse时发生的异常都实现了接口ClickHouseExceptionInterface并继承自ClickHouseException。因此,它们可以由基本接口
\Throwable
捕获。
- 所有在操作ClickHouse时发生的异常都实现了接口ClickHouseExceptionInterface并继承自ClickHouseException。因此,它们可以由基本接口
-
请求/Request(仅同步)
- 在此情况下,需要指出的是,如果您尝试发送类型为
Sync
的请求,即设置isAwaitableQuery
参数为true
,并且传递的SQL中不包含WHERE
条件,则会收到相应的异常,并且此类请求是不允许的。对于类型为Sync
的请求,您必须始终明确指定WHERE {condition}
。
- 在此情况下,需要指出的是,如果您尝试发送类型为