- factor_definition 表(migration b7f2a5e81c33,MySQL 已应用):name 主键 + 元数据 (formula/brief/frequency/lookback/direction/requires JSON/version)+ FactorDefinition entity(from_registry_def 由代码注册表构造) - FactorRepository Protocol + SQLAlchemy 实现(幂等 upsert/list/get) - /api/factors 改读 DB;目录为空自动 seed 注册表(幂等)—— 保留自定义因子登记能力 (计算仍须代码注册,引用未注册因子照常 FactorError,防伪因子) - tests/test_factor_catalog.py(repo 幂等/roundtrip/registry seed、API seed+字段齐全); test_api 的 client fixture 补 tmp sqlite session(factors 读库);全量 pytest 通过
29 lines
1.1 KiB
Python
29 lines
1.1 KiB
Python
"""因子目录表(M7.1)。
|
|
|
|
factor_definition:因子元数据契约源(name 主键幂等);requires 以 JSON 存。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import DateTime, Integer, String, Text
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from app.infrastructure.persistence.sqlalchemy.base import Base
|
|
|
|
|
|
class FactorDefinitionModel(Base):
|
|
__tablename__ = "factor_definition"
|
|
|
|
name: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
description: Mapped[str] = mapped_column(String(500), default="")
|
|
formula: Mapped[str] = mapped_column(String(500), default="")
|
|
brief: Mapped[str] = mapped_column(String(500), default="")
|
|
frequency: Mapped[str] = mapped_column(String(16), default="daily")
|
|
lookback: Mapped[int] = mapped_column(Integer, default=20)
|
|
direction: Mapped[str] = mapped_column(String(32), default="higher_is_better")
|
|
requires_json: Mapped[str] = mapped_column(Text, default="[]")
|
|
version: Mapped[str] = mapped_column(String(16), default="1")
|
|
created_at: Mapped[datetime] = mapped_column(DateTime)
|