reydb 1.1.60__py3-none-any.whl → 1.1.61__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- reydb/__init__.py +0 -1
- reydb/rall.py +0 -1
- reydb/rbuild.py +8 -2
- reydb/rconfig.py +411 -24
- reydb/rdb.py +68 -66
- reydb/rexec.py +27 -78
- reydb/rorm.py +13 -6
- reydb/rparam.py +187 -55
- {reydb-1.1.60.dist-info → reydb-1.1.61.dist-info}/METADATA +1 -1
- reydb-1.1.61.dist-info/RECORD +16 -0
- reydb/rinfo.py +0 -499
- reydb-1.1.60.dist-info/RECORD +0 -17
- {reydb-1.1.60.dist-info → reydb-1.1.61.dist-info}/WHEEL +0 -0
- {reydb-1.1.60.dist-info → reydb-1.1.61.dist-info}/licenses/LICENSE +0 -0
reydb/__init__.py
CHANGED
reydb/rall.py
CHANGED
reydb/rbuild.py
CHANGED
@@ -20,7 +20,9 @@ from .rorm import DatabaseORMModel
|
|
20
20
|
|
21
21
|
|
22
22
|
__all__ = (
|
23
|
+
'DatabaseBuildSuper',
|
23
24
|
'DatabaseBuild',
|
25
|
+
'DatabaseBuildAsync'
|
24
26
|
)
|
25
27
|
|
26
28
|
|
@@ -1283,7 +1285,6 @@ class DatabaseBuild(DatabaseBuildSuper['rdb.Database']):
|
|
1283
1285
|
# Handle parameter.
|
1284
1286
|
databases = databases or []
|
1285
1287
|
tables = tables or []
|
1286
|
-
tables_orm = tables_orm or []
|
1287
1288
|
views = views or []
|
1288
1289
|
views_stats = views_stats or []
|
1289
1290
|
|
@@ -1320,6 +1321,7 @@ class DatabaseBuild(DatabaseBuildSuper['rdb.Database']):
|
|
1320
1321
|
issubclass(params, DatabaseORMModel)
|
1321
1322
|
or isinstance(params, DatabaseORMModel)
|
1322
1323
|
):
|
1324
|
+
database = self.db.database
|
1323
1325
|
table = params.table().name
|
1324
1326
|
|
1325
1327
|
## Exist.
|
@@ -1565,7 +1567,11 @@ class DatabaseBuildAsync(DatabaseBuildSuper['rdb.DatabaseAsync']):
|
|
1565
1567
|
params_type = type(params)
|
1566
1568
|
|
1567
1569
|
## ORM.
|
1568
|
-
if
|
1570
|
+
if (
|
1571
|
+
is_instance(params)
|
1572
|
+
and isinstance(params, DatabaseORMModel)
|
1573
|
+
or issubclass(params, DatabaseORMModel)
|
1574
|
+
):
|
1569
1575
|
database = self.db.database
|
1570
1576
|
table = params.table().name
|
1571
1577
|
|
reydb/rconfig.py
CHANGED
@@ -9,8 +9,7 @@
|
|
9
9
|
"""
|
10
10
|
|
11
11
|
|
12
|
-
from typing import TypedDict, TypeVar
|
13
|
-
import datetime
|
12
|
+
from typing import TypedDict, TypeVar, Generic
|
14
13
|
from datetime import (
|
15
14
|
datetime as Datetime,
|
16
15
|
date as Date,
|
@@ -24,7 +23,9 @@ from .rbase import DatabaseBase
|
|
24
23
|
|
25
24
|
|
26
25
|
__all__ = (
|
26
|
+
'DatabaseConfigSuper',
|
27
27
|
'DatabaseConfig',
|
28
|
+
'DatabaseConfigAsync'
|
28
29
|
)
|
29
30
|
|
30
31
|
|
@@ -32,11 +33,12 @@ type ConfigValue = bool | str | int | float | list | tuple | dict | set | Dateti
|
|
32
33
|
ConfigRow = TypedDict('ConfigRow', {'key': str, 'value': ConfigValue, 'type': str, 'note': str | None})
|
33
34
|
type ConfigTable = list[ConfigRow]
|
34
35
|
ConfigValueT = TypeVar('T', bound=ConfigValue) # Any.
|
36
|
+
DatabaseT = TypeVar('DatabaseT', 'rdb.Database', 'rdb.DatabaseAsync')
|
35
37
|
|
36
38
|
|
37
|
-
class
|
39
|
+
class DatabaseConfigSuper(DatabaseBase, Generic[DatabaseT]):
|
38
40
|
"""
|
39
|
-
Database config type.
|
41
|
+
Database config super type.
|
40
42
|
Can create database used `self.build_db` method.
|
41
43
|
|
42
44
|
Examples
|
@@ -51,7 +53,7 @@ class DatabaseConfig(DatabaseBase):
|
|
51
53
|
|
52
54
|
def __init__(
|
53
55
|
self,
|
54
|
-
db:
|
56
|
+
db: DatabaseT,
|
55
57
|
db_names: dict[str, str] | None = None
|
56
58
|
) -> None:
|
57
59
|
"""
|
@@ -73,6 +75,21 @@ class DatabaseConfig(DatabaseBase):
|
|
73
75
|
self.db_names.update(db_names)
|
74
76
|
|
75
77
|
|
78
|
+
class DatabaseConfig(DatabaseConfigSuper['rdb.Database']):
|
79
|
+
"""
|
80
|
+
Database config type.
|
81
|
+
Can create database used `self.build_db` method.
|
82
|
+
|
83
|
+
Examples
|
84
|
+
--------
|
85
|
+
>>> config = DatabaseConfig()
|
86
|
+
>>> config['key1'] = 1
|
87
|
+
>>> config['key2', 'note'] = 2
|
88
|
+
>>> config['key1'], config['key2']
|
89
|
+
(1, 2)
|
90
|
+
"""
|
91
|
+
|
92
|
+
|
76
93
|
def build_db(self) -> None:
|
77
94
|
"""
|
78
95
|
Check and build database tables, by `self.db_names`.
|
@@ -83,26 +100,26 @@ class DatabaseConfig(DatabaseBase):
|
|
83
100
|
## Table.
|
84
101
|
class Config(self.db.orm.Model, table=True):
|
85
102
|
__name__ = self.db_names['config']
|
86
|
-
|
87
|
-
create_time:
|
88
|
-
update_time:
|
89
|
-
key = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), key=True, not_null=True, comment='Config key.')
|
90
|
-
value = self.db.orm.Field(type=self.db.orm.types.TEXT, not_null=True, comment='Config value.')
|
91
|
-
type = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), not_null=True, comment='Config value type.')
|
92
|
-
note = self.db.orm.Field(type=self.db.orm.types.VARCHAR(500), comment='Config note.')
|
103
|
+
__comment__ = 'Config data table.'
|
104
|
+
create_time: Datetime = self.db.orm.Field(not_null=True, field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config create time.')
|
105
|
+
update_time: Datetime = self.db.orm.Field(field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config update time.')
|
106
|
+
key: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), key=True, not_null=True, comment='Config key.')
|
107
|
+
value: str = self.db.orm.Field(type=self.db.orm.types.TEXT, not_null=True, comment='Config value.')
|
108
|
+
type: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), not_null=True, comment='Config value type.')
|
109
|
+
note: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(500), comment='Config note.')
|
93
110
|
|
94
111
|
tables = [Config]
|
95
112
|
|
96
113
|
## View stats.
|
97
114
|
views_stats = [
|
98
115
|
{
|
99
|
-
'path': self.db_names['stats_config'],
|
116
|
+
'path': (self.db.database, self.db_names['stats_config']),
|
100
117
|
'items': [
|
101
118
|
{
|
102
119
|
'name': 'count',
|
103
120
|
'select': (
|
104
121
|
'SELECT COUNT(1)\n'
|
105
|
-
f'FROM `{self.db_names['
|
122
|
+
f'FROM `{self.db_names['config']}`'
|
106
123
|
),
|
107
124
|
'comment': 'Config count.'
|
108
125
|
},
|
@@ -110,7 +127,7 @@ class DatabaseConfig(DatabaseBase):
|
|
110
127
|
'name': 'last_create_time',
|
111
128
|
'select': (
|
112
129
|
'SELECT MAX(`create_time`)\n'
|
113
|
-
f'FROM `{self.db_names['
|
130
|
+
f'FROM `{self.db_names['config']}`'
|
114
131
|
),
|
115
132
|
'comment': 'Config last record create time.'
|
116
133
|
},
|
@@ -118,7 +135,7 @@ class DatabaseConfig(DatabaseBase):
|
|
118
135
|
'name': 'last_update_time',
|
119
136
|
'select': (
|
120
137
|
'SELECT MAX(`update_time`)\n'
|
121
|
-
f'FROM `{self.db_names['
|
138
|
+
f'FROM `{self.db_names['config']}`'
|
122
139
|
),
|
123
140
|
'comment': 'Config last record update time.'
|
124
141
|
}
|
@@ -128,10 +145,9 @@ class DatabaseConfig(DatabaseBase):
|
|
128
145
|
]
|
129
146
|
|
130
147
|
# Build.
|
131
|
-
self.db.build.build(tables=tables, views_stats=views_stats)
|
148
|
+
self.db.build.build(tables=tables, views_stats=views_stats, skip=True)
|
132
149
|
|
133
150
|
|
134
|
-
@property
|
135
151
|
def data(self) -> ConfigTable:
|
136
152
|
"""
|
137
153
|
Get config data table.
|
@@ -149,7 +165,7 @@ class DatabaseConfig(DatabaseBase):
|
|
149
165
|
)
|
150
166
|
|
151
167
|
# Convert.
|
152
|
-
global_dict = {'datetime':
|
168
|
+
global_dict = {'datetime': Datetime}
|
153
169
|
result = [
|
154
170
|
{
|
155
171
|
'key': row['key'],
|
@@ -191,7 +207,7 @@ class DatabaseConfig(DatabaseBase):
|
|
191
207
|
if value is None:
|
192
208
|
value = default
|
193
209
|
else:
|
194
|
-
global_dict = {'datetime':
|
210
|
+
global_dict = {'datetime': Datetime}
|
195
211
|
value = eval(value, global_dict)
|
196
212
|
|
197
213
|
return value
|
@@ -204,7 +220,7 @@ class DatabaseConfig(DatabaseBase):
|
|
204
220
|
default_note: str | None = None
|
205
221
|
) -> ConfigValue | ConfigValueT:
|
206
222
|
"""
|
207
|
-
Set config value.
|
223
|
+
Set config default value.
|
208
224
|
|
209
225
|
Parameters
|
210
226
|
----------
|
@@ -316,7 +332,7 @@ class DatabaseConfig(DatabaseBase):
|
|
316
332
|
)
|
317
333
|
|
318
334
|
# Convert.
|
319
|
-
global_dict = {'datetime':
|
335
|
+
global_dict = {'datetime': Datetime}
|
320
336
|
result = result.to_dict('key', 'value')
|
321
337
|
result = {
|
322
338
|
key: eval(value, global_dict)
|
@@ -342,7 +358,7 @@ class DatabaseConfig(DatabaseBase):
|
|
342
358
|
)
|
343
359
|
|
344
360
|
# Convert.
|
345
|
-
global_dict = {'datetime':
|
361
|
+
global_dict = {'datetime': Datetime}
|
346
362
|
result = [
|
347
363
|
eval(value, global_dict)
|
348
364
|
for value in result
|
@@ -367,7 +383,7 @@ class DatabaseConfig(DatabaseBase):
|
|
367
383
|
)
|
368
384
|
|
369
385
|
# Convert.
|
370
|
-
global_dict = {'datetime':
|
386
|
+
global_dict = {'datetime': Datetime}
|
371
387
|
result = [
|
372
388
|
eval(value, global_dict)
|
373
389
|
for value in result
|
@@ -428,3 +444,374 @@ class DatabaseConfig(DatabaseBase):
|
|
428
444
|
data,
|
429
445
|
'update'
|
430
446
|
)
|
447
|
+
|
448
|
+
|
449
|
+
class DatabaseConfigAsync(DatabaseConfigSuper['rdb.DatabaseAsync']):
|
450
|
+
"""
|
451
|
+
Asynchronous database config type.
|
452
|
+
Can create database used `self.build_db` method.
|
453
|
+
|
454
|
+
Examples
|
455
|
+
--------
|
456
|
+
>>> config = DatabaseConfig()
|
457
|
+
>>> config['key1'] = 1
|
458
|
+
>>> config['key2', 'note'] = 2
|
459
|
+
>>> config['key1'], config['key2']
|
460
|
+
(1, 2)
|
461
|
+
"""
|
462
|
+
|
463
|
+
|
464
|
+
async def build_db(self) -> None:
|
465
|
+
"""
|
466
|
+
Asynchronous check and build database tables, by `self.db_names`.
|
467
|
+
"""
|
468
|
+
|
469
|
+
# Handle parameter.
|
470
|
+
|
471
|
+
## Table.
|
472
|
+
class Config(self.db.orm.Model, table=True):
|
473
|
+
__name__ = self.db_names['config']
|
474
|
+
__comment__ = 'Config data table.'
|
475
|
+
create_time: Datetime = self.db.orm.Field(not_null=True, field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config create time.')
|
476
|
+
update_time: Datetime = self.db.orm.Field(field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config update time.')
|
477
|
+
key: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), key=True, not_null=True, comment='Config key.')
|
478
|
+
value: str = self.db.orm.Field(type=self.db.orm.types.TEXT, not_null=True, comment='Config value.')
|
479
|
+
type: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), not_null=True, comment='Config value type.')
|
480
|
+
note: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(500), comment='Config note.')
|
481
|
+
|
482
|
+
tables = [Config]
|
483
|
+
|
484
|
+
## View stats.
|
485
|
+
views_stats = [
|
486
|
+
{
|
487
|
+
'path': (self.db.database, self.db_names['stats_config']),
|
488
|
+
'items': [
|
489
|
+
{
|
490
|
+
'name': 'count',
|
491
|
+
'select': (
|
492
|
+
'SELECT COUNT(1)\n'
|
493
|
+
f'FROM `{self.db_names['config']}`'
|
494
|
+
),
|
495
|
+
'comment': 'Config count.'
|
496
|
+
},
|
497
|
+
{
|
498
|
+
'name': 'last_create_time',
|
499
|
+
'select': (
|
500
|
+
'SELECT MAX(`create_time`)\n'
|
501
|
+
f'FROM `{self.db_names['config']}`'
|
502
|
+
),
|
503
|
+
'comment': 'Config last record create time.'
|
504
|
+
},
|
505
|
+
{
|
506
|
+
'name': 'last_update_time',
|
507
|
+
'select': (
|
508
|
+
'SELECT MAX(`update_time`)\n'
|
509
|
+
f'FROM `{self.db_names['config']}`'
|
510
|
+
),
|
511
|
+
'comment': 'Config last record update time.'
|
512
|
+
}
|
513
|
+
]
|
514
|
+
}
|
515
|
+
|
516
|
+
]
|
517
|
+
|
518
|
+
# Build.
|
519
|
+
await self.db.build.build(tables=tables, views_stats=views_stats, skip=True)
|
520
|
+
|
521
|
+
|
522
|
+
async def data(self) -> ConfigTable:
|
523
|
+
"""
|
524
|
+
Asynchronous get config data table.
|
525
|
+
|
526
|
+
Returns
|
527
|
+
-------
|
528
|
+
Config data table.
|
529
|
+
"""
|
530
|
+
|
531
|
+
# Get.
|
532
|
+
result = await self.db.execute.select(
|
533
|
+
self.db_names['config'],
|
534
|
+
['key', 'value', 'type', 'note'],
|
535
|
+
order='IFNULL(`update_time`, `create_time`) DESC'
|
536
|
+
)
|
537
|
+
|
538
|
+
# Convert.
|
539
|
+
global_dict = {'datetime': Datetime}
|
540
|
+
result = [
|
541
|
+
{
|
542
|
+
'key': row['key'],
|
543
|
+
'value': eval(row['value'], global_dict),
|
544
|
+
'note': row['note']
|
545
|
+
}
|
546
|
+
for row in result
|
547
|
+
]
|
548
|
+
|
549
|
+
return result
|
550
|
+
|
551
|
+
|
552
|
+
async def get(self, key: str, default: ConfigValueT | None = None) -> ConfigValue | ConfigValueT:
|
553
|
+
"""
|
554
|
+
Asynchronous get config value, when not exist, then return default value.
|
555
|
+
|
556
|
+
Parameters
|
557
|
+
----------
|
558
|
+
key : Config key.
|
559
|
+
default : Config default value.
|
560
|
+
|
561
|
+
Returns
|
562
|
+
-------
|
563
|
+
Config value.
|
564
|
+
"""
|
565
|
+
|
566
|
+
# Get.
|
567
|
+
where = '`key` = :key'
|
568
|
+
result = await self.db.execute.select(
|
569
|
+
self.db_names['config'],
|
570
|
+
'`value`',
|
571
|
+
where,
|
572
|
+
limit=1,
|
573
|
+
key=key
|
574
|
+
)
|
575
|
+
value = result.scalar()
|
576
|
+
|
577
|
+
# Default.
|
578
|
+
if value is None:
|
579
|
+
value = default
|
580
|
+
else:
|
581
|
+
global_dict = {'datetime': Datetime}
|
582
|
+
value = eval(value, global_dict)
|
583
|
+
|
584
|
+
return value
|
585
|
+
|
586
|
+
|
587
|
+
async def setdefault(
|
588
|
+
self,
|
589
|
+
key: str,
|
590
|
+
default: ConfigValueT | None = None,
|
591
|
+
default_note: str | None = None
|
592
|
+
) -> ConfigValue | ConfigValueT:
|
593
|
+
"""
|
594
|
+
Asynchronous set config default value.
|
595
|
+
|
596
|
+
Parameters
|
597
|
+
----------
|
598
|
+
key : Config key.
|
599
|
+
default : Config default value.
|
600
|
+
default_note : Config default note.
|
601
|
+
|
602
|
+
Returns
|
603
|
+
-------
|
604
|
+
Config value.
|
605
|
+
"""
|
606
|
+
|
607
|
+
# Set.
|
608
|
+
data = {
|
609
|
+
'key': key,
|
610
|
+
'value': repr(default),
|
611
|
+
'type': type(default).__name__,
|
612
|
+
'note': default_note
|
613
|
+
}
|
614
|
+
result = await self.db.execute.insert(
|
615
|
+
self.db_names['config'],
|
616
|
+
data,
|
617
|
+
'ignore'
|
618
|
+
)
|
619
|
+
|
620
|
+
# Get.
|
621
|
+
if result.rowcount == 0:
|
622
|
+
default = await self.get(key)
|
623
|
+
|
624
|
+
return default
|
625
|
+
|
626
|
+
|
627
|
+
async def update(self, data: dict[str, ConfigValue] | ConfigTable) -> None:
|
628
|
+
"""
|
629
|
+
Asynchronous update config values.
|
630
|
+
|
631
|
+
Parameters
|
632
|
+
----------
|
633
|
+
data : Config update data.
|
634
|
+
- `dict[str, Any]`: Config key and value.
|
635
|
+
- `ConfigTable`: Config key and value and note.
|
636
|
+
"""
|
637
|
+
|
638
|
+
# Handle parameter.
|
639
|
+
if type(data) == dict:
|
640
|
+
data = [
|
641
|
+
{
|
642
|
+
'key': key,
|
643
|
+
'value': repr(value),
|
644
|
+
'type': type(value).__name__
|
645
|
+
}
|
646
|
+
for key, value in data.items()
|
647
|
+
]
|
648
|
+
else:
|
649
|
+
data = data.copy()
|
650
|
+
for row in data:
|
651
|
+
row['value'] = repr(row['value'])
|
652
|
+
row['type'] = type(row['value']).__name__
|
653
|
+
|
654
|
+
# Update.
|
655
|
+
await self.db.execute.insert(
|
656
|
+
self.db_names['config'],
|
657
|
+
data,
|
658
|
+
'update'
|
659
|
+
)
|
660
|
+
|
661
|
+
|
662
|
+
async def remove(self, key: str | list[str]) -> None:
|
663
|
+
"""
|
664
|
+
Asynchronous remove config.
|
665
|
+
|
666
|
+
Parameters
|
667
|
+
----------
|
668
|
+
key : Config key or key list.
|
669
|
+
"""
|
670
|
+
|
671
|
+
# Remove.
|
672
|
+
if type(key) == str:
|
673
|
+
where = '`key` = :key'
|
674
|
+
limit = 1
|
675
|
+
else:
|
676
|
+
where = '`key` in :key'
|
677
|
+
limit = None
|
678
|
+
result = await self.db.execute.delete(
|
679
|
+
self.db_names['base.config'],
|
680
|
+
where,
|
681
|
+
limit=limit,
|
682
|
+
key=key
|
683
|
+
)
|
684
|
+
|
685
|
+
# Check.
|
686
|
+
if result.rowcount == 0:
|
687
|
+
throw(KeyError, key)
|
688
|
+
|
689
|
+
|
690
|
+
async def items(self) -> dict[str, ConfigValue]:
|
691
|
+
"""
|
692
|
+
Asynchronous get all config keys and values.
|
693
|
+
|
694
|
+
Returns
|
695
|
+
-------
|
696
|
+
All config keys and values.
|
697
|
+
"""
|
698
|
+
|
699
|
+
# Get.
|
700
|
+
result = await self.db.execute.select(
|
701
|
+
self.db_names['config'],
|
702
|
+
['key', 'value']
|
703
|
+
)
|
704
|
+
|
705
|
+
# Convert.
|
706
|
+
global_dict = {'datetime': Datetime}
|
707
|
+
result = result.to_dict('key', 'value')
|
708
|
+
result = {
|
709
|
+
key: eval(value, global_dict)
|
710
|
+
for key, value in result.items()
|
711
|
+
}
|
712
|
+
|
713
|
+
return result
|
714
|
+
|
715
|
+
|
716
|
+
async def keys(self) -> list[str]:
|
717
|
+
"""
|
718
|
+
Asynchronous get all config keys.
|
719
|
+
|
720
|
+
Returns
|
721
|
+
-------
|
722
|
+
All config keys.
|
723
|
+
"""
|
724
|
+
|
725
|
+
# Get.
|
726
|
+
result = await self.db.execute.select(
|
727
|
+
self.db_names['config'],
|
728
|
+
'`key`'
|
729
|
+
)
|
730
|
+
|
731
|
+
# Convert.
|
732
|
+
global_dict = {'datetime': Datetime}
|
733
|
+
result = [
|
734
|
+
eval(value, global_dict)
|
735
|
+
for value in result
|
736
|
+
]
|
737
|
+
|
738
|
+
return result
|
739
|
+
|
740
|
+
|
741
|
+
async def values(self) -> list[ConfigValue]:
|
742
|
+
"""
|
743
|
+
Asynchronous get all config value.
|
744
|
+
|
745
|
+
Returns
|
746
|
+
-------
|
747
|
+
All config values.
|
748
|
+
"""
|
749
|
+
|
750
|
+
# Get.
|
751
|
+
result = await self.db.execute.select(
|
752
|
+
self.db_names['config'],
|
753
|
+
'`value`'
|
754
|
+
)
|
755
|
+
|
756
|
+
# Convert.
|
757
|
+
global_dict = {'datetime': Datetime}
|
758
|
+
result = [
|
759
|
+
eval(value, global_dict)
|
760
|
+
for value in result
|
761
|
+
]
|
762
|
+
|
763
|
+
return result
|
764
|
+
|
765
|
+
|
766
|
+
async def __getitem__(self, key: str) -> ConfigValue:
|
767
|
+
"""
|
768
|
+
Asynchronous get config value.
|
769
|
+
|
770
|
+
Parameters
|
771
|
+
----------
|
772
|
+
key : Config key.
|
773
|
+
|
774
|
+
Returns
|
775
|
+
-------
|
776
|
+
Config value.
|
777
|
+
"""
|
778
|
+
|
779
|
+
# Get.
|
780
|
+
value = await self.get(key, Null)
|
781
|
+
|
782
|
+
# Check.
|
783
|
+
if value == Null:
|
784
|
+
throw(KeyError, key)
|
785
|
+
|
786
|
+
return value
|
787
|
+
|
788
|
+
|
789
|
+
async def __setitem__(self, key_note: str | tuple[str, str], value: ConfigValue) -> None:
|
790
|
+
"""
|
791
|
+
Asynchronous set config value.
|
792
|
+
|
793
|
+
Parameters
|
794
|
+
----------
|
795
|
+
key_note : Config key and note.
|
796
|
+
value : Config value.
|
797
|
+
"""
|
798
|
+
|
799
|
+
# Handle parameter.
|
800
|
+
if type(key_note) != str:
|
801
|
+
key, note = key_note
|
802
|
+
else:
|
803
|
+
key = key_note
|
804
|
+
note = None
|
805
|
+
|
806
|
+
# Set.
|
807
|
+
data = {
|
808
|
+
'key': key,
|
809
|
+
'value': repr(value),
|
810
|
+
'type': type(value).__name__,
|
811
|
+
'note': note
|
812
|
+
}
|
813
|
+
await self.db.execute.insert(
|
814
|
+
self.db_names['config'],
|
815
|
+
data,
|
816
|
+
'update'
|
817
|
+
)
|