From 339d85a9274304bc002b8b735805e960f773b59e Mon Sep 17 00:00:00 2001 From: claude_dev Date: Sun, 5 Jul 2026 21:03:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(data):=20read=5Fdb=5Fdaily=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=20vnpy=20database=20=E8=B7=AF=E5=BE=84=EF=BC=88?= =?UTF-8?q?=E4=BF=AE=E7=AB=AF=E5=88=B0=E7=AB=AF=E8=AF=BB=E5=8F=96=20gap?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix: read_db_daily 现在在调用 get_database() 前配置 vnpy SETTINGS, 指向 cfg.data_paths["vnpy_db"](NAS quant_trading.db),修复端到端冒烟发现的读取 gap。 --- sanguo_data/datareader.py | 5 +++++ tests/data/test_datareader.py | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/sanguo_data/datareader.py b/sanguo_data/datareader.py index bdb4718..c05585e 100644 --- a/sanguo_data/datareader.py +++ b/sanguo_data/datareader.py @@ -13,6 +13,7 @@ from datetime import datetime from vnpy.trader.object import BarData from vnpy.trader.constant import Exchange, Interval from vnpy.trader.database import get_database +from vnpy.trader.setting import SETTINGS def read_parquet_daily(symbol: str, start: str, end: str, cfg) -> list[BarData]: daily_dir = Path(cfg.data_paths["daily_dir"]) @@ -55,6 +56,10 @@ def guess_exchange(symbol: str) -> Exchange: def read_db_daily(symbol: str, start: str, end: str, cfg) -> list[BarData]: + # Configure vnpy database SETTINGS before calling get_database() + SETTINGS["database.name"] = "sqlite" + SETTINGS["database.database"] = cfg.data_paths["vnpy_db"] + db = get_database() start_dt = datetime.strptime(start, "%Y-%m-%d") end_dt = datetime.strptime(end, "%Y-%m-%d") diff --git a/tests/data/test_datareader.py b/tests/data/test_datareader.py index 186baa2..929bb7f 100644 --- a/tests/data/test_datareader.py +++ b/tests/data/test_datareader.py @@ -1,7 +1,9 @@ import pandas as pd +from unittest.mock import patch, MagicMock from vnpy.trader.constant import Exchange, Interval +from vnpy.trader.setting import SETTINGS from sanguo_data.config import DataConfig -from sanguo_data.datareader import read_parquet_daily, guess_exchange +from sanguo_data.datareader import read_parquet_daily, guess_exchange, read_db_daily def test_read_parquet_daily_returns_bardata(tmp_path): year_dir = tmp_path / "2026" @@ -30,3 +32,23 @@ def test_guess_exchange_sh(): def test_guess_exchange_sz(): assert guess_exchange("000001").value == "SZSE" + + +def test_read_db_daily_configures_vnpy_settings(): + """Test that read_db_daily configures vnpy SETTINGS with correct database path.""" + cfg = DataConfig( + data_paths={"vnpy_db": "/volume1/stock/sanguo_vnpy/data/quant_trading.db"}, + data_sources={}, validation={}, performance={}, + ) + + # Mock get_database to avoid actual database connection + mock_db = MagicMock() + mock_db.load_bar_data.return_value = [] # Return empty list to avoid data processing + + with patch('sanguo_data.datareader.get_database', return_value=mock_db): + # Call read_db_daily + read_db_daily("600000", "2024-01-01", "2024-12-31", cfg) + + # Assert that SETTINGS was configured correctly + assert SETTINGS["database.name"] == "sqlite", f"Expected database.name to be 'sqlite', got {SETTINGS.get('database.name')}" + assert SETTINGS["database.database"] == cfg.data_paths["vnpy_db"], f"Expected database.database to be {cfg.data_paths['vnpy_db']}, got {SETTINGS.get('database.database')}"