Skip to content

Commit f971f00

Browse files
committed
feat: add internal schema support and schema_providers config
- Add internal param to register_schema for business data (zvt_info, trader_info, stock_tags, etc.) not tied to external data source - Mark internal schemas with internal=True, store in zvt_context.internal_db_names - Update storage_config docs for schema_providers - Update factor/tag/trader/trading schemas to use internal=True
1 parent 9de23f3 commit f971f00

File tree

14 files changed

+34
-12
lines changed

14 files changed

+34
-12
lines changed

docs/storage_config.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"storage": {
1010
"base_path": null,
1111
"path_template": null,
12-
"storage_routes": {}
12+
"storage_routes": {},
13+
"schema_providers": {}
1314
}
1415
}
1516
```
@@ -21,6 +22,7 @@
2122
| `base_path` | string \| null | 数据根路径。`null` 时使用 `zvt_env["data_path"]`(即 `zvt_home/data`|
2223
| `path_template` | string \| null | 路径模板。占位符:`{base_path}`, `{provider}`, `{db_name}`, `{storage_id}``null` 时使用默认规则 |
2324
| `storage_routes` | object | 路由覆盖。键格式 `"provider\|db_name"`,值为自定义 `storage_id` |
25+
| `schema_providers` | object | 无 Recorder 的 schema 的 provider 映射。键为 `db_name`,值为 `["provider"]` 数组。用于 fallback 或 internal schema |
2426

2527
### 默认行为(不配置时)
2628

@@ -57,3 +59,7 @@
5759
}
5860
}
5961
```
62+
63+
## Internal Schema(内部 schema)
64+
65+
业务逻辑类数据(如 `zvt_info``trader_info``stock_tags`)与外部数据源无关,通过 `register_schema(..., internal=True)` 标记为 internal。Internal schema 只做存储路由,不参与 provider 切换。其 provider(如 `zvt`)在 `schema_providers` 中配置,用于确定存储路径。

src/zvt/contract/context.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ def __init__(self) -> None:
5555
#: factor class registry
5656
self.factor_cls_registry = {}
5757

58+
#: db_names of internal schemas (business logic data, not tied to external data source)
59+
self.internal_db_names = set()
60+
5861
#: Optional StorageBackend; if set, api uses it instead of get_storage_backend()
5962
self.storage_backend: Optional["StorageBackend"] = None
6063

src/zvt/contract/register.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,16 @@ def register_schema(
9696
db_name: str,
9797
schema_base: DeclarativeMeta,
9898
entity_type: str = None,
99+
internal: bool = False,
99100
):
100101
"""
101102
Register schema. Providers come from Recorder registration (provider_map_recorder).
102103
Tables/engines are created lazily on first get_db_engine(provider, db_name).
103-
For schemas without Recorders (e.g. zvt_info), add to config: storage.schema_providers.
104+
For schemas without Recorders, add to config: storage.schema_providers.
105+
106+
:param internal: If True, schema is business/internal data, not tied to external data source.
107+
Internal schemas only care about storage routing, do not participate in
108+
provider switching (e.g. zvt_info, trader_info, stock_tags).
104109
"""
105110
schemas = []
106111
for item in schema_base.registry.mappers:
@@ -111,12 +116,15 @@ def register_schema(
111116
zvt_context.schemas.append(cls)
112117
if issubclass(cls, Mixin):
113118
cls._zvt_db_name = db_name
119+
cls._zvt_internal = internal # internal=True: business data, no external data source
114120
if entity_type:
115121
add_to_map_list(the_map=zvt_context.entity_map_schemas, key=entity_type, value=cls)
116122
schemas.append(cls)
117123

118124
zvt_context.dbname_map_schemas[db_name] = schemas
119125
zvt_context.dbname_map_base[db_name] = schema_base
126+
if internal:
127+
zvt_context.internal_db_names.add(db_name)
120128

121129

122130
# the __all__ is generated

src/zvt/contract/schema.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ def register_provider(cls, provider):
8383
if provider not in cls._zvt_providers_override:
8484
cls._zvt_providers_override.append(provider)
8585

86+
@classmethod
87+
def is_internal(cls) -> bool:
88+
"""True if schema is internal/business data, not tied to external data source."""
89+
return getattr(cls, "_zvt_internal", False)
90+
8691
@classmethod
8792
def get_providers(cls) -> List[str]:
8893
"""

src/zvt/contract/zvt_info.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class FactorState(ZvtInfoBase, StateMixin):
4040
__tablename__ = "factor_state"
4141

4242

43-
register_schema(db_name="zvt_info", schema_base=ZvtInfoBase)
43+
register_schema(db_name="zvt_info", schema_base=ZvtInfoBase, internal=True)
4444

4545

4646
# the __all__ is generated

src/zvt/factors/ma/domain/stock_1d_ma_factor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Stock1dMaFactor(Stock1dMaFactorBase, Mixin):
3232
ma250 = Column(Float)
3333

3434

35-
register_schema(db_name="stock_1d_ma_factor", schema_base=Stock1dMaFactorBase)
35+
register_schema(db_name="stock_1d_ma_factor", schema_base=Stock1dMaFactorBase, internal=True)
3636

3737

3838
# the __all__ is generated

src/zvt/factors/ma/domain/stock_1d_ma_stats_factor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Stock1dMaStatsFactor(Stock1dMaStatsFactorBase, MaStatsFactorCommon):
1111
__tablename__ = "stock_1d_ma_stats_factor"
1212

1313

14-
register_schema(db_name="stock_1d_ma_stats_factor", schema_base=Stock1dMaStatsFactorBase)
14+
register_schema(db_name="stock_1d_ma_stats_factor", schema_base=Stock1dMaStatsFactorBase, internal=True)
1515

1616

1717
# the __all__ is generated

src/zvt/factors/top_stocks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class TopStocks(TopStocksBase, Mixin):
5454
all_stocks_count = Column(Integer)
5555

5656

57-
register_schema(db_name="top_stocks", schema_base=TopStocksBase)
57+
register_schema(db_name="top_stocks", schema_base=TopStocksBase, internal=True)
5858

5959

6060
def compute_vol_up_stocks(target_date, provider="em", adjust_type=AdjustType.qfq, stock_type="small", entity_ids=None):

src/zvt/factors/zen/domain/index_1d_zen_factor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Index1dZenFactor(Index1dZenFactorBase, ZenFactorCommon):
1111
__tablename__ = "index_1d_zen_factor"
1212

1313

14-
register_schema(db_name="index_1d_zen_factor", schema_base=Index1dZenFactorBase, entity_type="index")
14+
register_schema(db_name="index_1d_zen_factor", schema_base=Index1dZenFactorBase, entity_type="index", internal=True)
1515

1616

1717
# the __all__ is generated

src/zvt/factors/zen/domain/stock_1d_zen_factor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Stock1dZenFactor(Stock1dZenFactorBase, ZenFactorCommon):
1111
__tablename__ = "stock_1d_zen_factor"
1212

1313

14-
register_schema(db_name="stock_1d_zen_factor", schema_base=Stock1dZenFactorBase, entity_type="stock")
14+
register_schema(db_name="stock_1d_zen_factor", schema_base=Stock1dZenFactorBase, entity_type="stock", internal=True)
1515

1616

1717
# the __all__ is generated

0 commit comments

Comments
 (0)