From f0b4fb76dc67fb4b2d2695c87775cc8d307808e9 Mon Sep 17 00:00:00 2001 From: zlt Date: Fri, 24 Jul 2026 14:57:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=B9=E5=99=A8=E5=8C=96=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common.py | 12 ++++++++---- docker-compose.yml | 2 ++ run.py | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/common.py b/common.py index d942791..816022d 100644 --- a/common.py +++ b/common.py @@ -89,12 +89,16 @@ def register(factor_code, display_name, table, category, desc, } with db.factor_conn() as conn: with conn.cursor() as cur: - cur.execute("SELECT column_name FROM information_schema.columns " - "WHERE table_schema=DATABASE() AND table_name='factor_metadata'") - cols = {r[0] for r in cur.fetchall()} + # ShardingSphere 代理不支持 information_schema 内省 → 用真实查询取列名 + cur.execute("SELECT * FROM factor_metadata LIMIT 0") + cols = [d[0] for d in (cur.description or [])] + if not cols: # 极端兜底:代理连列元数据都不给时,用平台已知 schema + cols = ["factor_code", "display_name", "target_ds_name", "target_table_name", + "start_date", "end_date", "author", "description", "category", + "frequency", "status", "factor_type"] use = [k for k in values if k in cols] if "factor_code" not in use: - raise RuntimeError("factor_metadata 无 factor_code 列?请核实线上 schema") + raise RuntimeError(f"factor_metadata 取不到 factor_code 列;实际列: {cols}") ph = ",".join(["%s"] * len(use)) upd = ",".join(f"{k}=VALUES({k})" for k in use if k != "factor_code") cur.execute( diff --git a/docker-compose.yml b/docker-compose.yml index 8cdf808..12d99bd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,8 @@ services: env_file: .env restart: unless-stopped command: sleep infinity + volumes: + - .:/app # 代码卷挂载:改码即生效,不用重构镜像(开发期)。冻结成 prod 镜像时删此行并 --build。 # 跨机部署(默认):.env 三处用 LAN IP,默认 bridge 网络出网到 LAN 即可。 # 与 astock-kg 同机同网时,改用服务名连基座 PG——取消下面两行注释并填网络名: # networks: [default, akg_net] diff --git a/run.py b/run.py index 6bad855..b980507 100644 --- a/run.py +++ b/run.py @@ -11,6 +11,10 @@ daily 模式:不给 --date 则取今天;start=end=date。history 模式: """ import argparse import datetime as dt +import warnings + +# pandas 用 DBAPI 连接读 SQL 会 warn(无害,功能正常)——静音保持日志干净 +warnings.filterwarnings("ignore", message=".*only supports SQLAlchemy.*") import common import db @@ -35,6 +39,21 @@ def cmd_views(): except Exception as e: # noqa: BLE001 print(f" ❌ {name}: {e!r}") + fronts = [ + ("热度 heat(trade_date)", "heat", "SELECT MAX(trade_date) FROM stock_fund_heat_scores"), + ("一致预期 consensus(asof)", "pg", "SELECT MAX(asof_date) FROM v_factor_consensus"), + ("事件 events(disclosure)", "pg", "SELECT MAX(disclosure_date) FROM v_factor_events"), + ("传导 transmission(scan)", "pg", "SELECT MAX(scan_date) FROM v_factor_transmission"), + ("行情 gp_day_data(ts)", "price", "SELECT MAX(`timestamp`) FROM gp_day_data"), + ] + print("\n数据前沿(各源最新日期——build 的 --date 照此选,别选没数据的未来日):") + for name, src, sql in fronts: + try: + df = db.read_pg(sql) if src == "pg" else db.read_mysql(src, sql) + print(f" {name}: {df.iloc[0, 0]}") + except Exception as e: # noqa: BLE001 + print(f" {name}: ❌ {e!r}") + _META = { "akg_upside": ("astock-kg 预期空间", "分析师一致预期目标价隐含收益率(target_mid/price-1)"),