survos/key-value-bundle

该软件包已被废弃且不再维护。作者建议使用 survos/pixie-bundle 软件包。

Symfony Bundle,可轻松实现 SQLite 键值查找

资助软件包维护!
kbond

安装: 60

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 3

分支: 0

开放问题: 2

类型:symfony-bundle

1.5.241 2024-06-25 19:30 UTC

README

键值包

一个利用 Sqlite 创建索引化非结构化数据存储库的 Symfony 包。

灵感来源于 https://gist.github.com/sbrl/c3bfbbbb3d1419332e9ece1bac8bb71chttps://dexie.org/ 以及 Symfony PDO 缓存组件。

其核心思想是存储可以通过键或过滤器访问的字符串或非结构化数据。

最初,它只是一个字符串查找,例如,通过 QID 查找 wikidata 对象,或通过 imdb_id 查找 csv 文件中的电影。

您可以通过添加一个包含便于重命名字段和数据转换指令的 .conf 文件来自定义导入过程。您还可以在导入和导出过程中监听事件。

Pixy 可以(将,最终)使用 json schema 文件来定义字段。使用 LiFormBundle 的 https://json-schema.fullstack.org.cn/

可以通过命令行、监听器或 .conf 文件定义索引。有一种简短的格式,即逗号分隔的字符串格式,以及一种详细的格式,即键为索引详细信息的哈希格式。

如果安装了 api-platform,将存在一个 API 端点。

与 survos/translation-bundle 集成

设置

所有 Pixy 数据库文件都有一个关联的配置文件,该文件描述了映射和底层数据结构。通常它与相同的基准文件名共享。

curl 
bin/console pixy:init movies --dir=./data/imdb 
# ./pixy/movies.yaml created with 4 tables, configure it and run bin/console pixy:import movies --limit 10  
cat > pixy.movies << 'END'
(full config)
END
bin/console pixy:import movies --limit 10  
symfony open:local --path="/pixy/movies"

“特殊”表

由于 Pixy 数据库提供了一种方便地处理 Excel 数据的方法,因此存在一个用于处理绘图(嵌入图像)的特殊表。它是通过 bin/console grid:excel-to-csv(在 grid-group 包中?在 museado 中?)创建的。

Excel 将嵌入的图像存储为“绘图”。

翻译也存储为 Pixy 表,并有自己的部分。

示例

  • 电影(imdb)
  • 学校

CSV 数据集

读取现有的 Pixy

$pixy = new Pixy::Reader('school.pixy');
$pixy->select('mo')
foreach ($pixy->)
wget https://dummyjson.com/products products.json
// inject the service

$id = 'tt123';
$kv = $keyValueService->getStorageBox('dummy.pixy', [
    'products' => 'sku,brand,category' // first key is text primary key by default
]);

$kv->select('products'); // so that we don't have to pass it each time.

$kv->set($data); // because they key is in the data.
assert($kv->get($id));
assert($kv->has($id));
assert(json_decode($kv->get($id)) == $data);
//

conf 文件简化了一些 PHP 调用,但并非绝对必要

假设我们想按类别筛选。首先,我们需要在表中添加一个类似于 dexie 的索引。

$kv = $keyValueService->getStorageBox('app.db', [
    'movies' => 'imdb_id, year|integer, category|string' // first key is text primary key by default
]);

$rows = $kv->where("year < 2000 and category='drama'")->iterate();
// without the index
$rows = $kv->where("json_extract(value, '$.year') < 2000")->iterate();

通常 CSV 文件和其他数据源中的键名与 sqlite 列名不兼容。为了将旧名称映射到新名称,您可以创建一个用于列名称的正则表达式规则序列。

从 MOMA Artists.json

{
  "ConstituentID": 1,
  "DisplayName": "Robert Arneson",
  "ArtistBio": "American, 1930–1992",
  "Nationality": "American",
  "Gender": "male",
  "BeginDate": 1930,
  "EndDate": 1992,
  "Wiki QID": null
}
$kv->map([
   '/ConstituentID/' => 'id',
   '/BeginDate/' => 'birthYear',
   '/EndDate/' => 'deathYear'
], [
    'artists'
]);

所有字段都将转换为 camel_case,即使没有正则表达式规则。

请注意,JSON 未压缩,因此键是重复的。因此,sqlite 文件的大小比 CSV 大(rowCount * headerRowSize)。

用法

composer require survos/key-value-bundle

使用 sqlite 数据库名称以及任何要创建的新表初始化 StorageBox。

可以重复使用现有表,但自动表创建已禁用。

$kvDb = new StorageBox('translation.db', ['es', 'en'], 'en');
$key = md5('dog');
$kvDb->set($key, 'perro', 'es');
$kvDb->set($key, 'dog'); // defaults to en
$trans = $kvDb->get($key); // dog 
$trans = $kvDb->get($key, 'es'); // perro 
// trans is perro

// cache-like with callcack
$trans = $kvDb->get($key, callback: fn($item) => $this->translator->trans('dog'));

// keys are automatically slugified
$trans = $kvDb->get('My name is', fn($item) => $this->translator->trans($item->key));

// keys are automatically slugified
$trans = $kvDb->get('My name is',   ) => $this->translator->trans($item->key));

多语言 StorageBox

特别是用于可能具有翻译的文本字段的 kv 查找

$kvDb = new MLSB('property.db', ['label','description']);

$key = 'Q31';
$kvDb->set($key, 'label', 'Belgium', 'en-gb');
$kvDb->set($key, 'description', 'constitutional monarchy in Western Europe', 'en-gb');

$transArray = $kvDb->getFieldsByLocale($key, 'en-gb'); 
// ['label' => 'Belgium'...]

$label = $kvDb->getField($key, 'label', 'en-gb'); 
// 'Belgium'

$transArray = $kvDb->getFields($key); 
// ['en-gb' => ['label' => 'Belgium', 'description'  => ...]]

// ditto for set, needs transactions