confio


Nameconfio JSON
Version 0.3.2 PyPI version JSON
download
home_pagehttps://gitee.com/wangankeji/confio
SummaryConfigurations IO for various of data sources with unified interfaces.
upload_time2023-01-05 08:14:59
maintainerhyjiacan
docs_urlNone
authorhyjiacan
requires_python>=3.5
license
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 配置读写组件

此组件用于对本地配置进行读写,目前支持以下类型的配置:

- `ConfFS` 文件系统
- `ConfDB` 数据库 (默认使用 MySQL)
- `ConfConsul`

## TODOs

- [ ] 配置值加密支持
- [ ] 其它配置源支持
    - [ ] Redis
    - [ ] sqlite
    - [ ] ini
    - [ ] yaml
    - [ ] properties
    - [ ] toml

## 概述

此组件针对不同的数据源提供了相同的数据读写接口,以避免开发过程中,读写不同数据源中配置的差异,以及无缝切换数据源。

### 配置文件

配置文件的存储基于 JSON 格式,并且扁平化读写。 配置项在配置文件中,以数组的方式存在,每项为一个配置项。

可使用的配置字段如下:

- `name` 配置项名称
- `id_` 配置项标识,建议均为小写
- `value` 系统值
- `user_value` 用户值
- `desc` 描述
- `enabled` 是否启用,默认为 `true` (保留字),暂未使用

其中,`value` 为系统设置的值(或者叫做默认值),`user_value` 为用户设置的值,通过 `.value` 取值时,会优先获取 `user_value`,为空时会使用 `value`

字段名称 `value` 可以添加一些类型修饰符,详见 [#类型修饰符](#类型修饰符)

> 一般来说,在项目的开发过程中,使用 json 数据格式来对配置进行管理。
> 而在线上运行时,使用数据库对配置进行管理。

### 类型修饰符

类型修饰符用于简化一些数据的写法。只能写在 `value` 字段名上,其作用于 `value` 和 `user_value` 的值,写法如下:

```json
{
  "value:path": "../to/path"
}
```

其中的 `:path` 就是修饰符,可选值好如下:

0. 不指定类型
1. `path` 其值为一个文件系统的路径
    - 在这种情况下,字段名称 `type` 值为 `path`
    - 其值可以是绝对路径,或者相对路径(相对于项目根目录)。 当其为相对路径时,组件会自动计算出其绝对路径
    - 在这种情况下,需要通过 `ValueParser.PATH_ROOT=` 或者 `ValueParser(path_root=)`
2. `expr` 其值为一个表达式
    - 在这种情况下,字段名称 `type` 值为 `expr`
    - 一般来说,仅仅在字段的数据类型为数值时才应该指定这种类型
    - 其值应该是一个合法的 python 表达式(其中不能包含需要通过外部导入的模块)
    - 例:`60 * 10`, `5 * (20 + 8 * (27 - 4))`
    - 通过 `.value` 得到的值单位均为 数值类型 **int**
3. `size` 其值为文件大小
    - 在这个情况下,字段名称 `type` 值为 `size`
    - 一般来说,仅仅在配置文件/占用空间大小等需要使用存储单位时才使用此值
    - 使用的进制为 `1024`
    - 写法:允许使用 `k/m/g/t` 作为单位
    - 例:`10m`, `50g`
    - 通过 `.value` 得到的值单位均为 数值类型 **byte**
3. `time` 其值为时间范围(多少年,月,天,小时,分,秒)
    - 在这个情况下,字段名称 `type` 值为 `time`
    - 一般来说,仅仅在时间范围相关等需要使用时间存储单位时才使用此值
    - 写法:允许使用以下作为单位 **区分大小写**
        - `s` 秒(可以省略)
        - `m` 分钟
        - `h` 小时
        - `D` 天
        - `M` 月(一个月仅按30天计算)
        - `Y` 年(一年按365天计算)
    - 例:
        - `10m` 10 分钟
        - `500` 500 秒
        - `1h20m` 1 小时 20 分
    - 通过 `.value` 得到的值单位均为 数值类型 **秒**

> 当指定类型修饰符时,`value` 和 `user_value` 的值必须是一个字符串

## 快速上手

配置文件 _/config/module1/conf.json_

```json
[
  {
    "key": "foo",
    "value": "bar",
    "name": "test"
  },
  {
    "...": "..."
  }
]
```

```python
from confio import ConfFS

conf_root = '/config'

conf = ConfFS(conf_root)
# 配置项存在,得到值 bar
conf.get('module1.conf.foo')
# 配置项不存在,得到值 None
conf.get('module1.conf.bar')
# 配置项不存在,使用默认值 'foo'
conf.get('module1.conf.bar', default='foo')
# 匹配所有以 module1.conf 开头的项
conf.match('module1.conf')
```

## 初始化

**ConfFS** 基于文件系统 (JSON 格式) 的配置存储,其通过目录和文件进行模块分割。

```python
from confio import ConfFS

conf = ConfFS(conf_root='/config')
```

`conf_root` 存放配置文件的根目录(应该是一个绝对路径),所有的配置模块,基于此目录计算。

> 此模块会自动缓存。在文件更改后会自动更新缓存(主动模式,即读取时才会更新)

**ConfDB** 基于数据库的配置存储。

> `ConfDB` 依赖 [dbutils](https://pypi.org/project/DBUtils/) 和 [PyMysql](https://pypi.org/project/PyMySQL/) 包。

```python
from confio import ConfDB

conf = ConfDB(
    database='database-name',
    host='127.0.0.1',
    port=3306,
    user='root',
    password='',
    charset='',
    table_name='conf_items'
)
```

> 在使用数据库时,其表名称默认为 `conf_items`

可以指定一个值处理器 `ValueParser`,其用于处理字段 `type` 指定的不同类型。

可以指定一个自定义的枚举类型,其用于扩展内置的 `ConfTypes` 枚举,在使用了自定义的 `type` 时会用到。

在系统内使用了 `type=path` 时,那么需要通过以下方式指定根路径:

```python
from confio import ValueParser, ConfItem

# 指定全局的根路径
ValueParser.PATH_ROOT = 'xxx'

# 按实例指定根路径
parser = ValueParser('xxx')
ConfItem.parser = parser

from enum import Enum


class MyConfTypes(Enum):
    XXX = 'xxx'
    """
    支持 type="xxx": "key:xxx": 123
    """


ValueParser.enum_class_ext = MyConfTypes
```

## 值处理拦截器

```python
from confio import ValueParser, ConfTypes


def value_handler(parse_type: ConfTypes, raw_value, parsed_value, prev_value):
    return prev_value


ValueParser.add_interceptor(value_handler)
```

## 接口说明

在以下文档中,

- `fs.abc()` 表示 `ConfFS().abc()`
- `db.abc()` 表示 `ConfDB().abc()`

### load

加载所有配置项

`load() -> List[ConfItem]`

参数:

_无_

返回:

所有配置项的列表

### get

获取指定配置项的值。

`get(id_: str, default=None, value_only=True) -> Union[ConfItem, Any]`

参数:

- `id_` 指定的配置项 ID。其必须是与配置名称完全一致
- `default` 指定的默认值。当指定的配置项不存在时,使用此值
- `value_only` 是否仅返回配置项的值。指定为 `True` 时表示仅返回配置项的值, 为 `False` 时表示返回 `ConfItem` 对象

返回:

返回一个 `ConfItem` 对象(`value_only=False`)或具体的某个字段的值

### match

获取匹配指定前缀的所有配置项的值。

`match(prefix: str, value_only=True, fullkey=False) -> Dict[str, Union[ConfItem, Any]]`

参数:

- `prefix` 指定的前缀。其必须按模块指定,如: 存在模块 `aaa.bbb.ccc`,只能通过 `aaa` 或 `aaa.bbb` 进行匹配, 不能通过 `aa` 或 `aaa.b` 或者 `aaa.bbb.ccc`
  进行匹配
- `value_only` 是否仅返回配置项的值。指定为 `True` 时表示仅返回配置项的值, 为 `False` 时表示返回 `ConfItem` 对象
- `fullkey` 是否返回完整的 `id_`

返回:

配置项的键值对集合。

当 `fullkey=True` 时,键名称为键名全称,否则为除去 `prefix` 后的名称

如:

`prefix='aaa'`,有配置项 `aaa.bbb.ccc=5`, 当 `fullkey=True` 时,返回 `{'aaa.bbb.ccc': 5}`; 当 `fullkey=False`
时,返回 `{'bbb.ccc': 5}`;

### set

添加/更新配置项的值。

`set(id_: str, value, update_sys_value=False, allow_add=False):`

参数:

- `id_` 指定的配置项
- `value` 指定配置项的值,当此值类型为 `ConfItem` 时,会更新配置项的所有属性
- `update_sys_value` 是否更新系统值,默认情况下更新用户值
- `allow_add` 在指定项不存在时,是否允许添加新的配置项

返回:

_无_

注意:当在更新用户值时, confio 会检查用户值与系统值的数据类型是否一致。

### batch_set

批量添加/更新配置项的值。

`set(items: Union[Dict[str, Any], List[ConfItem]], prefix: str = None, update_sys_value=False, allow_add=False):`

参数:

- `items` 指定的配置项
- `prefix` 指定的配置项使用的前缀。在指定了此值后,会给 `items` 中的每一项的ID添加此前缀
- `value` 指定配置项的值
- `update_sys_value` 在 `value` **不**为 `ConfItem` 类型时有效。是否新增为系统值,默认情况下新增为用户值
- `allow_add` 在指定项不存在时,是否允许添加新的配置项

返回:

_无_

### remove

移除指定的配置项。

`remove(id_: Union[str, List[str], Tuple[str]]) -> Optional[Union[ConfItem, List[ConfItem]]]`

> 注意:指定的项不存在时,此项操作会被忽略。

参数:

- `id_` 要移除的配置项 ID(或 ID集合)

返回:

_无_


## 钩子

为了便于对读写的值进行处理,可以实现钩子来对其进行自定义处理。

```python
from restfx import IHook, ConfItem


class MyHook(IHook):
    def read_value(self, item: ConfItem):
        return True, 'customize_value'

    def read_raw_value(self, item: ConfItem):
        return True, 'customize_value'
```



            

Raw data

            {
    "_id": null,
    "home_page": "https://gitee.com/wangankeji/confio",
    "name": "confio",
    "maintainer": "hyjiacan",
    "docs_url": null,
    "requires_python": ">=3.5",
    "maintainer_email": "hyjiacan@163.com",
    "keywords": "",
    "author": "hyjiacan",
    "author_email": "hyjiacan@163.com",
    "download_url": "https://files.pythonhosted.org/packages/fd/3a/4920ea49182c4853dd4e90a3d76a030b87744ae25a87a829d0d26bb6580f/confio-0.3.2.tar.gz",
    "platform": null,
    "description": "# \u914d\u7f6e\u8bfb\u5199\u7ec4\u4ef6\n\n\u6b64\u7ec4\u4ef6\u7528\u4e8e\u5bf9\u672c\u5730\u914d\u7f6e\u8fdb\u884c\u8bfb\u5199\uff0c\u76ee\u524d\u652f\u6301\u4ee5\u4e0b\u7c7b\u578b\u7684\u914d\u7f6e\uff1a\n\n- `ConfFS` \u6587\u4ef6\u7cfb\u7edf\n- `ConfDB` \u6570\u636e\u5e93 (\u9ed8\u8ba4\u4f7f\u7528 MySQL)\n- `ConfConsul`\n\n## TODOs\n\n- [ ] \u914d\u7f6e\u503c\u52a0\u5bc6\u652f\u6301\n- [ ] \u5176\u5b83\u914d\u7f6e\u6e90\u652f\u6301\n    - [ ] Redis\n    - [ ] sqlite\n    - [ ] ini\n    - [ ] yaml\n    - [ ] properties\n    - [ ] toml\n\n## \u6982\u8ff0\n\n\u6b64\u7ec4\u4ef6\u9488\u5bf9\u4e0d\u540c\u7684\u6570\u636e\u6e90\u63d0\u4f9b\u4e86\u76f8\u540c\u7684\u6570\u636e\u8bfb\u5199\u63a5\u53e3\uff0c\u4ee5\u907f\u514d\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u8bfb\u5199\u4e0d\u540c\u6570\u636e\u6e90\u4e2d\u914d\u7f6e\u7684\u5dee\u5f02\uff0c\u4ee5\u53ca\u65e0\u7f1d\u5207\u6362\u6570\u636e\u6e90\u3002\n\n### \u914d\u7f6e\u6587\u4ef6\n\n\u914d\u7f6e\u6587\u4ef6\u7684\u5b58\u50a8\u57fa\u4e8e JSON \u683c\u5f0f\uff0c\u5e76\u4e14\u6241\u5e73\u5316\u8bfb\u5199\u3002 \u914d\u7f6e\u9879\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\uff0c\u4ee5\u6570\u7ec4\u7684\u65b9\u5f0f\u5b58\u5728\uff0c\u6bcf\u9879\u4e3a\u4e00\u4e2a\u914d\u7f6e\u9879\u3002\n\n\u53ef\u4f7f\u7528\u7684\u914d\u7f6e\u5b57\u6bb5\u5982\u4e0b\uff1a\n\n- `name` \u914d\u7f6e\u9879\u540d\u79f0\n- `id_` \u914d\u7f6e\u9879\u6807\u8bc6\uff0c\u5efa\u8bae\u5747\u4e3a\u5c0f\u5199\n- `value` \u7cfb\u7edf\u503c\n- `user_value` \u7528\u6237\u503c\n- `desc` \u63cf\u8ff0\n- `enabled` \u662f\u5426\u542f\u7528\uff0c\u9ed8\u8ba4\u4e3a `true` (\u4fdd\u7559\u5b57)\uff0c\u6682\u672a\u4f7f\u7528\n\n\u5176\u4e2d\uff0c`value` \u4e3a\u7cfb\u7edf\u8bbe\u7f6e\u7684\u503c\uff08\u6216\u8005\u53eb\u505a\u9ed8\u8ba4\u503c\uff09\uff0c`user_value` \u4e3a\u7528\u6237\u8bbe\u7f6e\u7684\u503c\uff0c\u901a\u8fc7 `.value` \u53d6\u503c\u65f6\uff0c\u4f1a\u4f18\u5148\u83b7\u53d6 `user_value`\uff0c\u4e3a\u7a7a\u65f6\u4f1a\u4f7f\u7528 `value`\n\n\u5b57\u6bb5\u540d\u79f0 `value` \u53ef\u4ee5\u6dfb\u52a0\u4e00\u4e9b\u7c7b\u578b\u4fee\u9970\u7b26\uff0c\u8be6\u89c1 [#\u7c7b\u578b\u4fee\u9970\u7b26](#\u7c7b\u578b\u4fee\u9970\u7b26)\n\n> \u4e00\u822c\u6765\u8bf4\uff0c\u5728\u9879\u76ee\u7684\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u4f7f\u7528 json \u6570\u636e\u683c\u5f0f\u6765\u5bf9\u914d\u7f6e\u8fdb\u884c\u7ba1\u7406\u3002\n> \u800c\u5728\u7ebf\u4e0a\u8fd0\u884c\u65f6\uff0c\u4f7f\u7528\u6570\u636e\u5e93\u5bf9\u914d\u7f6e\u8fdb\u884c\u7ba1\u7406\u3002\n\n### \u7c7b\u578b\u4fee\u9970\u7b26\n\n\u7c7b\u578b\u4fee\u9970\u7b26\u7528\u4e8e\u7b80\u5316\u4e00\u4e9b\u6570\u636e\u7684\u5199\u6cd5\u3002\u53ea\u80fd\u5199\u5728 `value` \u5b57\u6bb5\u540d\u4e0a\uff0c\u5176\u4f5c\u7528\u4e8e `value` \u548c `user_value` \u7684\u503c\uff0c\u5199\u6cd5\u5982\u4e0b\uff1a\n\n```json\n{\n  \"value:path\": \"../to/path\"\n}\n```\n\n\u5176\u4e2d\u7684 `:path` \u5c31\u662f\u4fee\u9970\u7b26\uff0c\u53ef\u9009\u503c\u597d\u5982\u4e0b\uff1a\n\n0. \u4e0d\u6307\u5b9a\u7c7b\u578b\n1. `path` \u5176\u503c\u4e3a\u4e00\u4e2a\u6587\u4ef6\u7cfb\u7edf\u7684\u8def\u5f84\n    - \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5b57\u6bb5\u540d\u79f0 `type` \u503c\u4e3a `path`\n    - \u5176\u503c\u53ef\u4ee5\u662f\u7edd\u5bf9\u8def\u5f84\uff0c\u6216\u8005\u76f8\u5bf9\u8def\u5f84\uff08\u76f8\u5bf9\u4e8e\u9879\u76ee\u6839\u76ee\u5f55\uff09\u3002 \u5f53\u5176\u4e3a\u76f8\u5bf9\u8def\u5f84\u65f6\uff0c\u7ec4\u4ef6\u4f1a\u81ea\u52a8\u8ba1\u7b97\u51fa\u5176\u7edd\u5bf9\u8def\u5f84\n    - \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u9700\u8981\u901a\u8fc7 `ValueParser.PATH_ROOT=` \u6216\u8005 `ValueParser(path_root=)`\n2. `expr` \u5176\u503c\u4e3a\u4e00\u4e2a\u8868\u8fbe\u5f0f\n    - \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5b57\u6bb5\u540d\u79f0 `type` \u503c\u4e3a `expr`\n    - \u4e00\u822c\u6765\u8bf4\uff0c\u4ec5\u4ec5\u5728\u5b57\u6bb5\u7684\u6570\u636e\u7c7b\u578b\u4e3a\u6570\u503c\u65f6\u624d\u5e94\u8be5\u6307\u5b9a\u8fd9\u79cd\u7c7b\u578b\n    - \u5176\u503c\u5e94\u8be5\u662f\u4e00\u4e2a\u5408\u6cd5\u7684 python \u8868\u8fbe\u5f0f\uff08\u5176\u4e2d\u4e0d\u80fd\u5305\u542b\u9700\u8981\u901a\u8fc7\u5916\u90e8\u5bfc\u5165\u7684\u6a21\u5757\uff09\n    - \u4f8b\uff1a`60 * 10`, `5 * (20 + 8 * (27 - 4))`\n    - \u901a\u8fc7 `.value` \u5f97\u5230\u7684\u503c\u5355\u4f4d\u5747\u4e3a \u6570\u503c\u7c7b\u578b **int**\n3. `size` \u5176\u503c\u4e3a\u6587\u4ef6\u5927\u5c0f\n    - \u5728\u8fd9\u4e2a\u60c5\u51b5\u4e0b\uff0c\u5b57\u6bb5\u540d\u79f0 `type` \u503c\u4e3a `size`\n    - \u4e00\u822c\u6765\u8bf4\uff0c\u4ec5\u4ec5\u5728\u914d\u7f6e\u6587\u4ef6/\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u7b49\u9700\u8981\u4f7f\u7528\u5b58\u50a8\u5355\u4f4d\u65f6\u624d\u4f7f\u7528\u6b64\u503c\n    - \u4f7f\u7528\u7684\u8fdb\u5236\u4e3a `1024`\n    - \u5199\u6cd5\uff1a\u5141\u8bb8\u4f7f\u7528 `k/m/g/t` \u4f5c\u4e3a\u5355\u4f4d\n    - \u4f8b\uff1a`10m`, `50g`\n    - \u901a\u8fc7 `.value` \u5f97\u5230\u7684\u503c\u5355\u4f4d\u5747\u4e3a \u6570\u503c\u7c7b\u578b **byte**\n3. `time` \u5176\u503c\u4e3a\u65f6\u95f4\u8303\u56f4\uff08\u591a\u5c11\u5e74\uff0c\u6708\uff0c\u5929\uff0c\u5c0f\u65f6\uff0c\u5206\uff0c\u79d2\uff09\n    - \u5728\u8fd9\u4e2a\u60c5\u51b5\u4e0b\uff0c\u5b57\u6bb5\u540d\u79f0 `type` \u503c\u4e3a `time`\n    - \u4e00\u822c\u6765\u8bf4\uff0c\u4ec5\u4ec5\u5728\u65f6\u95f4\u8303\u56f4\u76f8\u5173\u7b49\u9700\u8981\u4f7f\u7528\u65f6\u95f4\u5b58\u50a8\u5355\u4f4d\u65f6\u624d\u4f7f\u7528\u6b64\u503c\n    - \u5199\u6cd5\uff1a\u5141\u8bb8\u4f7f\u7528\u4ee5\u4e0b\u4f5c\u4e3a\u5355\u4f4d **\u533a\u5206\u5927\u5c0f\u5199**\n        - `s` \u79d2\uff08\u53ef\u4ee5\u7701\u7565\uff09\n        - `m` \u5206\u949f\n        - `h` \u5c0f\u65f6\n        - `D` \u5929\n        - `M` \u6708\uff08\u4e00\u4e2a\u6708\u4ec5\u630930\u5929\u8ba1\u7b97\uff09\n        - `Y` \u5e74\uff08\u4e00\u5e74\u6309365\u5929\u8ba1\u7b97\uff09\n    - \u4f8b\uff1a\n        - `10m` 10 \u5206\u949f\n        - `500` 500 \u79d2\n        - `1h20m` 1 \u5c0f\u65f6 20 \u5206\n    - \u901a\u8fc7 `.value` \u5f97\u5230\u7684\u503c\u5355\u4f4d\u5747\u4e3a \u6570\u503c\u7c7b\u578b **\u79d2**\n\n> \u5f53\u6307\u5b9a\u7c7b\u578b\u4fee\u9970\u7b26\u65f6\uff0c`value` \u548c `user_value` \u7684\u503c\u5fc5\u987b\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\n\n## \u5feb\u901f\u4e0a\u624b\n\n\u914d\u7f6e\u6587\u4ef6 _/config/module1/conf.json_\n\n```json\n[\n  {\n    \"key\": \"foo\",\n    \"value\": \"bar\",\n    \"name\": \"test\"\n  },\n  {\n    \"...\": \"...\"\n  }\n]\n```\n\n```python\nfrom confio import ConfFS\n\nconf_root = '/config'\n\nconf = ConfFS(conf_root)\n# \u914d\u7f6e\u9879\u5b58\u5728\uff0c\u5f97\u5230\u503c bar\nconf.get('module1.conf.foo')\n# \u914d\u7f6e\u9879\u4e0d\u5b58\u5728\uff0c\u5f97\u5230\u503c None\nconf.get('module1.conf.bar')\n# \u914d\u7f6e\u9879\u4e0d\u5b58\u5728\uff0c\u4f7f\u7528\u9ed8\u8ba4\u503c 'foo'\nconf.get('module1.conf.bar', default='foo')\n# \u5339\u914d\u6240\u6709\u4ee5 module1.conf \u5f00\u5934\u7684\u9879\nconf.match('module1.conf')\n```\n\n## \u521d\u59cb\u5316\n\n**ConfFS** \u57fa\u4e8e\u6587\u4ef6\u7cfb\u7edf (JSON \u683c\u5f0f) \u7684\u914d\u7f6e\u5b58\u50a8\uff0c\u5176\u901a\u8fc7\u76ee\u5f55\u548c\u6587\u4ef6\u8fdb\u884c\u6a21\u5757\u5206\u5272\u3002\n\n```python\nfrom confio import ConfFS\n\nconf = ConfFS(conf_root='/config')\n```\n\n`conf_root` \u5b58\u653e\u914d\u7f6e\u6587\u4ef6\u7684\u6839\u76ee\u5f55(\u5e94\u8be5\u662f\u4e00\u4e2a\u7edd\u5bf9\u8def\u5f84)\uff0c\u6240\u6709\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u57fa\u4e8e\u6b64\u76ee\u5f55\u8ba1\u7b97\u3002\n\n> \u6b64\u6a21\u5757\u4f1a\u81ea\u52a8\u7f13\u5b58\u3002\u5728\u6587\u4ef6\u66f4\u6539\u540e\u4f1a\u81ea\u52a8\u66f4\u65b0\u7f13\u5b58(\u4e3b\u52a8\u6a21\u5f0f\uff0c\u5373\u8bfb\u53d6\u65f6\u624d\u4f1a\u66f4\u65b0)\n\n**ConfDB** \u57fa\u4e8e\u6570\u636e\u5e93\u7684\u914d\u7f6e\u5b58\u50a8\u3002\n\n> `ConfDB` \u4f9d\u8d56 [dbutils](https://pypi.org/project/DBUtils/) \u548c [PyMysql](https://pypi.org/project/PyMySQL/) \u5305\u3002\n\n```python\nfrom confio import ConfDB\n\nconf = ConfDB(\n    database='database-name',\n    host='127.0.0.1',\n    port=3306,\n    user='root',\n    password='',\n    charset='',\n    table_name='conf_items'\n)\n```\n\n> \u5728\u4f7f\u7528\u6570\u636e\u5e93\u65f6\uff0c\u5176\u8868\u540d\u79f0\u9ed8\u8ba4\u4e3a `conf_items`\n\n\u53ef\u4ee5\u6307\u5b9a\u4e00\u4e2a\u503c\u5904\u7406\u5668 `ValueParser`\uff0c\u5176\u7528\u4e8e\u5904\u7406\u5b57\u6bb5 `type` \u6307\u5b9a\u7684\u4e0d\u540c\u7c7b\u578b\u3002\n\n\u53ef\u4ee5\u6307\u5b9a\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684\u679a\u4e3e\u7c7b\u578b\uff0c\u5176\u7528\u4e8e\u6269\u5c55\u5185\u7f6e\u7684 `ConfTypes` \u679a\u4e3e\uff0c\u5728\u4f7f\u7528\u4e86\u81ea\u5b9a\u4e49\u7684 `type` \u65f6\u4f1a\u7528\u5230\u3002\n\n\u5728\u7cfb\u7edf\u5185\u4f7f\u7528\u4e86 `type=path` \u65f6\uff0c\u90a3\u4e48\u9700\u8981\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u6307\u5b9a\u6839\u8def\u5f84:\n\n```python\nfrom confio import ValueParser, ConfItem\n\n# \u6307\u5b9a\u5168\u5c40\u7684\u6839\u8def\u5f84\nValueParser.PATH_ROOT = 'xxx'\n\n# \u6309\u5b9e\u4f8b\u6307\u5b9a\u6839\u8def\u5f84\nparser = ValueParser('xxx')\nConfItem.parser = parser\n\nfrom enum import Enum\n\n\nclass MyConfTypes(Enum):\n    XXX = 'xxx'\n    \"\"\"\n    \u652f\u6301 type=\"xxx\": \"key:xxx\": 123\n    \"\"\"\n\n\nValueParser.enum_class_ext = MyConfTypes\n```\n\n## \u503c\u5904\u7406\u62e6\u622a\u5668\n\n```python\nfrom confio import ValueParser, ConfTypes\n\n\ndef value_handler(parse_type: ConfTypes, raw_value, parsed_value, prev_value):\n    return prev_value\n\n\nValueParser.add_interceptor(value_handler)\n```\n\n## \u63a5\u53e3\u8bf4\u660e\n\n\u5728\u4ee5\u4e0b\u6587\u6863\u4e2d\uff0c\n\n- `fs.abc()` \u8868\u793a `ConfFS().abc()`\n- `db.abc()` \u8868\u793a `ConfDB().abc()`\n\n### load\n\n\u52a0\u8f7d\u6240\u6709\u914d\u7f6e\u9879\n\n`load() -> List[ConfItem]`\n\n\u53c2\u6570\uff1a\n\n_\u65e0_\n\n\u8fd4\u56de\uff1a\n\n\u6240\u6709\u914d\u7f6e\u9879\u7684\u5217\u8868\n\n### get\n\n\u83b7\u53d6\u6307\u5b9a\u914d\u7f6e\u9879\u7684\u503c\u3002\n\n`get(id_: str, default=None, value_only=True) -> Union[ConfItem, Any]`\n\n\u53c2\u6570\uff1a\n\n- `id_` \u6307\u5b9a\u7684\u914d\u7f6e\u9879 ID\u3002\u5176\u5fc5\u987b\u662f\u4e0e\u914d\u7f6e\u540d\u79f0\u5b8c\u5168\u4e00\u81f4\n- `default` \u6307\u5b9a\u7684\u9ed8\u8ba4\u503c\u3002\u5f53\u6307\u5b9a\u7684\u914d\u7f6e\u9879\u4e0d\u5b58\u5728\u65f6\uff0c\u4f7f\u7528\u6b64\u503c\n- `value_only` \u662f\u5426\u4ec5\u8fd4\u56de\u914d\u7f6e\u9879\u7684\u503c\u3002\u6307\u5b9a\u4e3a `True` \u65f6\u8868\u793a\u4ec5\u8fd4\u56de\u914d\u7f6e\u9879\u7684\u503c\uff0c \u4e3a `False` \u65f6\u8868\u793a\u8fd4\u56de `ConfItem` \u5bf9\u8c61\n\n\u8fd4\u56de\uff1a\n\n\u8fd4\u56de\u4e00\u4e2a `ConfItem` \u5bf9\u8c61(`value_only=False`)\u6216\u5177\u4f53\u7684\u67d0\u4e2a\u5b57\u6bb5\u7684\u503c\n\n### match\n\n\u83b7\u53d6\u5339\u914d\u6307\u5b9a\u524d\u7f00\u7684\u6240\u6709\u914d\u7f6e\u9879\u7684\u503c\u3002\n\n`match(prefix: str, value_only=True, fullkey=False) -> Dict[str, Union[ConfItem, Any]]`\n\n\u53c2\u6570\uff1a\n\n- `prefix` \u6307\u5b9a\u7684\u524d\u7f00\u3002\u5176\u5fc5\u987b\u6309\u6a21\u5757\u6307\u5b9a\uff0c\u5982\uff1a \u5b58\u5728\u6a21\u5757 `aaa.bbb.ccc`\uff0c\u53ea\u80fd\u901a\u8fc7 `aaa` \u6216 `aaa.bbb` \u8fdb\u884c\u5339\u914d\uff0c \u4e0d\u80fd\u901a\u8fc7 `aa` \u6216 `aaa.b` \u6216\u8005 `aaa.bbb.ccc`\n  \u8fdb\u884c\u5339\u914d\n- `value_only` \u662f\u5426\u4ec5\u8fd4\u56de\u914d\u7f6e\u9879\u7684\u503c\u3002\u6307\u5b9a\u4e3a `True` \u65f6\u8868\u793a\u4ec5\u8fd4\u56de\u914d\u7f6e\u9879\u7684\u503c\uff0c \u4e3a `False` \u65f6\u8868\u793a\u8fd4\u56de `ConfItem` \u5bf9\u8c61\n- `fullkey` \u662f\u5426\u8fd4\u56de\u5b8c\u6574\u7684 `id_`\n\n\u8fd4\u56de\uff1a\n\n\u914d\u7f6e\u9879\u7684\u952e\u503c\u5bf9\u96c6\u5408\u3002\n\n\u5f53 `fullkey=True` \u65f6\uff0c\u952e\u540d\u79f0\u4e3a\u952e\u540d\u5168\u79f0\uff0c\u5426\u5219\u4e3a\u9664\u53bb `prefix` \u540e\u7684\u540d\u79f0\n\n\u5982\uff1a\n\n`prefix='aaa'`\uff0c\u6709\u914d\u7f6e\u9879 `aaa.bbb.ccc=5`\uff0c \u5f53 `fullkey=True` \u65f6\uff0c\u8fd4\u56de `{'aaa.bbb.ccc': 5}`\uff1b \u5f53 `fullkey=False`\n\u65f6\uff0c\u8fd4\u56de `{'bbb.ccc': 5}`\uff1b\n\n### set\n\n\u6dfb\u52a0/\u66f4\u65b0\u914d\u7f6e\u9879\u7684\u503c\u3002\n\n`set(id_: str, value, update_sys_value=False, allow_add=False):`\n\n\u53c2\u6570\uff1a\n\n- `id_` \u6307\u5b9a\u7684\u914d\u7f6e\u9879\n- `value` \u6307\u5b9a\u914d\u7f6e\u9879\u7684\u503c\uff0c\u5f53\u6b64\u503c\u7c7b\u578b\u4e3a `ConfItem` \u65f6\uff0c\u4f1a\u66f4\u65b0\u914d\u7f6e\u9879\u7684\u6240\u6709\u5c5e\u6027\n- `update_sys_value` \u662f\u5426\u66f4\u65b0\u7cfb\u7edf\u503c\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u66f4\u65b0\u7528\u6237\u503c\n- `allow_add` \u5728\u6307\u5b9a\u9879\u4e0d\u5b58\u5728\u65f6\uff0c\u662f\u5426\u5141\u8bb8\u6dfb\u52a0\u65b0\u7684\u914d\u7f6e\u9879\n\n\u8fd4\u56de\uff1a\n\n_\u65e0_\n\n\u6ce8\u610f\uff1a\u5f53\u5728\u66f4\u65b0\u7528\u6237\u503c\u65f6\uff0c confio \u4f1a\u68c0\u67e5\u7528\u6237\u503c\u4e0e\u7cfb\u7edf\u503c\u7684\u6570\u636e\u7c7b\u578b\u662f\u5426\u4e00\u81f4\u3002\n\n### batch_set\n\n\u6279\u91cf\u6dfb\u52a0/\u66f4\u65b0\u914d\u7f6e\u9879\u7684\u503c\u3002\n\n`set(items: Union[Dict[str, Any], List[ConfItem]], prefix: str = None, update_sys_value=False, allow_add=False):`\n\n\u53c2\u6570\uff1a\n\n- `items` \u6307\u5b9a\u7684\u914d\u7f6e\u9879\n- `prefix` \u6307\u5b9a\u7684\u914d\u7f6e\u9879\u4f7f\u7528\u7684\u524d\u7f00\u3002\u5728\u6307\u5b9a\u4e86\u6b64\u503c\u540e\uff0c\u4f1a\u7ed9 `items` \u4e2d\u7684\u6bcf\u4e00\u9879\u7684ID\u6dfb\u52a0\u6b64\u524d\u7f00\n- `value` \u6307\u5b9a\u914d\u7f6e\u9879\u7684\u503c\n- `update_sys_value` \u5728 `value` **\u4e0d**\u4e3a `ConfItem` \u7c7b\u578b\u65f6\u6709\u6548\u3002\u662f\u5426\u65b0\u589e\u4e3a\u7cfb\u7edf\u503c\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u65b0\u589e\u4e3a\u7528\u6237\u503c\n- `allow_add` \u5728\u6307\u5b9a\u9879\u4e0d\u5b58\u5728\u65f6\uff0c\u662f\u5426\u5141\u8bb8\u6dfb\u52a0\u65b0\u7684\u914d\u7f6e\u9879\n\n\u8fd4\u56de\uff1a\n\n_\u65e0_\n\n### remove\n\n\u79fb\u9664\u6307\u5b9a\u7684\u914d\u7f6e\u9879\u3002\n\n`remove(id_: Union[str, List[str], Tuple[str]]) -> Optional[Union[ConfItem, List[ConfItem]]]`\n\n> \u6ce8\u610f\uff1a\u6307\u5b9a\u7684\u9879\u4e0d\u5b58\u5728\u65f6\uff0c\u6b64\u9879\u64cd\u4f5c\u4f1a\u88ab\u5ffd\u7565\u3002\n\n\u53c2\u6570\uff1a\n\n- `id_` \u8981\u79fb\u9664\u7684\u914d\u7f6e\u9879 ID(\u6216 ID\u96c6\u5408)\n\n\u8fd4\u56de\uff1a\n\n_\u65e0_\n\n\n## \u94a9\u5b50\n\n\u4e3a\u4e86\u4fbf\u4e8e\u5bf9\u8bfb\u5199\u7684\u503c\u8fdb\u884c\u5904\u7406\uff0c\u53ef\u4ee5\u5b9e\u73b0\u94a9\u5b50\u6765\u5bf9\u5176\u8fdb\u884c\u81ea\u5b9a\u4e49\u5904\u7406\u3002\n\n```python\nfrom restfx import IHook, ConfItem\n\n\nclass MyHook(IHook):\n    def read_value(self, item: ConfItem):\n        return True, 'customize_value'\n\n    def read_raw_value(self, item: ConfItem):\n        return True, 'customize_value'\n```\n\n\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "Configurations IO for various of data sources with unified interfaces.",
    "version": "0.3.2",
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eb587cbd76b2a8cb4011a924e676d8082f01d37b9f64e5c056111d3f95c5c6f1",
                "md5": "fd539f8bc29867f78b5ae89de7ec20a9",
                "sha256": "95f03ab71a75c65ef12ea19b08fb9dbe829ef52516af6bca498935415a4b30e5"
            },
            "downloads": -1,
            "filename": "confio-0.3.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fd539f8bc29867f78b5ae89de7ec20a9",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.5",
            "size": 19317,
            "upload_time": "2023-01-05T08:14:57",
            "upload_time_iso_8601": "2023-01-05T08:14:57.161913Z",
            "url": "https://files.pythonhosted.org/packages/eb/58/7cbd76b2a8cb4011a924e676d8082f01d37b9f64e5c056111d3f95c5c6f1/confio-0.3.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fd3a4920ea49182c4853dd4e90a3d76a030b87744ae25a87a829d0d26bb6580f",
                "md5": "a72bd5269d061d4a92c7520c0f58a0f0",
                "sha256": "6a2e66bb2ed60c019e85521be5467af96d8a032459ac86797cae59ead250bbf1"
            },
            "downloads": -1,
            "filename": "confio-0.3.2.tar.gz",
            "has_sig": false,
            "md5_digest": "a72bd5269d061d4a92c7520c0f58a0f0",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.5",
            "size": 18858,
            "upload_time": "2023-01-05T08:14:59",
            "upload_time_iso_8601": "2023-01-05T08:14:59.405715Z",
            "url": "https://files.pythonhosted.org/packages/fd/3a/4920ea49182c4853dd4e90a3d76a030b87744ae25a87a829d0d26bb6580f/confio-0.3.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-01-05 08:14:59",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "lcname": "confio"
}
        
Elapsed time: 0.02632s