Files
tick-stock-panel/backend/tests/test_parquet_schema_compat.py
wshy 6bb6eadb12 fix(storage): 兼容 parquet 分区 schema 演进
兼容 quote_ts 等新增存储列导致的新旧 parquet 分区 schema 差异,恢复老用户 enriched 缓存刷新和看板/选股页面显示。
2026-07-09 17:38:44 +08:00

82 lines
2.6 KiB
Python

from datetime import date
import polars as pl
from app.parquet import scan_daily_parquet, scan_enriched_parquet
def test_partitioned_daily_scan_tolerates_added_quote_ts(tmp_path):
old_part = tmp_path / "kline_daily" / "date=2026-07-08" / "part.parquet"
new_part = tmp_path / "kline_daily" / "date=2026-07-09" / "part.parquet"
old_part.parent.mkdir(parents=True)
new_part.parent.mkdir(parents=True)
pl.DataFrame({
"symbol": ["600000.SH"],
"date": [date(2026, 7, 8)],
"open": [10.0],
"high": [10.5],
"low": [9.8],
"close": [10.2],
"volume": [1000.0],
"amount": [10200.0],
}).write_parquet(old_part)
pl.DataFrame({
"symbol": ["600000.SH"],
"date": [date(2026, 7, 9)],
"open": [10.2],
"high": [10.8],
"low": [10.1],
"close": [10.6],
"volume": [1200],
"amount": [12720.0],
"quote_ts": [1783560600000],
}).write_parquet(new_part)
df = scan_daily_parquet(str(tmp_path / "kline_daily" / "**" / "*.parquet")).sort("date").collect()
assert df.height == 2
assert df.schema["volume"] == pl.Float64
assert df.schema["quote_ts"] == pl.Int64
assert df["quote_ts"].to_list() == [None, 1783560600000]
def test_partitioned_enriched_scan_tolerates_added_quote_ts(tmp_path):
base = tmp_path / "kline_daily_enriched"
old_part = base / "date=2026-07-08" / "part.parquet"
new_part = base / "date=2026-07-09" / "part.parquet"
old_part.parent.mkdir(parents=True)
new_part.parent.mkdir(parents=True)
common_old = {
"symbol": ["600000.SH"],
"date": [date(2026, 7, 8)],
"open": [10.0],
"high": [10.5],
"low": [9.8],
"close": [10.2],
"volume": [1000.0],
"amount": [10200.0],
"raw_close": [10.2],
"raw_high": [10.5],
"raw_low": [9.8],
"turnover_rate": [1.1],
"consecutive_limit_ups": pl.Series([0], dtype=pl.UInt32),
"consecutive_limit_downs": pl.Series([0], dtype=pl.UInt32),
}
pl.DataFrame(common_old).write_parquet(old_part)
common_new = dict(common_old)
common_new["date"] = [date(2026, 7, 9)]
common_new["volume"] = [1200]
common_new["quote_ts"] = [1783560600000]
pl.DataFrame(common_new).write_parquet(new_part)
df = scan_enriched_parquet(str(base / "**" / "*.parquet")).sort("date").collect()
assert df.height == 2
assert df.schema["volume"] == pl.Float64
assert df.schema["quote_ts"] == pl.Int64
assert df["quote_ts"].to_list() == [None, 1783560600000]