From cfcc0596ffa5ed49e7e3dfe0b4213609333398c2 Mon Sep 17 00:00:00 2001 From: dekun Date: Wed, 7 Oct 2026 13:40:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=8D=E7=9B=98=E4=BA=A4?= =?UTF-8?q?=E6=98=93=E8=AE=B0=E5=BD=95=E5=B9=B6=E5=8F=91=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=20prev=5Fentry=5Ftf=20=E5=AF=BC=E8=87=B4=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- lib/options/options_review_db.py | 11 ++++++++++- lib/options/options_review_register.py | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/options/options_review_db.py b/lib/options/options_review_db.py index be67a2b..8c79ae4 100644 --- a/lib/options/options_review_db.py +++ b/lib/options/options_review_db.py @@ -87,6 +87,7 @@ def init_options_review_tables(conn: sqlite3.Connection) -> None: strategy_tag TEXT, direction_view TEXT, entry_logic TEXT, + prev_entry_tf TEXT, exit_reason TEXT, followed_plan TEXT, mistake_tags TEXT, @@ -141,5 +142,13 @@ def _ensure_column(conn: sqlite3.Connection, table: str, col: str, typedef: str) names.add(str(r["name"])) except (TypeError, KeyError, IndexError): names.add(str(r[1])) - if col not in names: + if col in names: + return + try: conn.execute(f"ALTER TABLE {table} ADD COLUMN {col} {typedef}") + except sqlite3.OperationalError as e: + # 并发首启时多个请求同时 ADD,后者报 duplicate column — 可忽略 + msg = str(e).lower() + if "duplicate column" in msg or "already exists" in msg: + return + raise diff --git a/lib/options/options_review_register.py b/lib/options/options_review_register.py index 0c64e59..7b33d45 100644 --- a/lib/options/options_review_register.py +++ b/lib/options/options_review_register.py @@ -326,6 +326,9 @@ def register_options_review_routes(app: Flask, cfg: dict[str, Any], repo_root: s "pages": pages, } ) + except Exception as e: + print(f"[options_review_trades] {e}", flush=True) + return jsonify({"ok": False, "msg": f"加载交易记录失败: {e}"}), 500 finally: conn.close() @@ -447,6 +450,10 @@ def register_options_review_routes(app: Flask, cfg: dict[str, Any], repo_root: s ) stats["source_types"] = list(SOURCE_TYPES) stats["source_labels"] = SOURCE_LABELS + stats["ok"] = True return jsonify(stats) + except Exception as e: + print(f"[options_review_stats] {e}", flush=True) + return jsonify({"ok": False, "msg": f"加载统计失败: {e}"}), 500 finally: conn.close()