Files
sanguo_vnpy_v2/scripts/nas_sync/export_table.py
T
claude_dev b2aab85105
CI/CD / test (push) Successful in 10s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / vps (push) Successful in 18s
feat(nas_sync): 小表全量同步管线(constituent_unified+bs_adjust_factor)
新增 export_table.py/merge_table.py/sync_tables.sh: VPS stdin喂python全量dump → scp → NAS全量替换(DROP+CREATE+INSERT,幂等可重跑)。sync_dbbardata.sh 每日increment末尾连带跑 sync_tables,保持NAS副本成份股/复权因子不陈旧。修复NAS组合回测选股恒空(NAS副本缺constituent_unified表,phase3只导dbbardata)。
2026-07-31 08:18:36 +08:00

49 lines
1.7 KiB
Python

"""VPS 端:全量导出单张小表到独立 sqlite 文件(搬数据,merge 端重建 schema)。
用于 constituent_unified / bs_adjust_factor 等小表全量同步
(无 id 增量键、行数万级、变化不频繁,全量 dump+replace 最简)。
- 纯 sqlite3 标准库,零第三方依赖。
- 只读主库(mode=ro),不干扰 VPS 生产写入。
- CREATE TABLE AS SELECT 搬数据(列名保留;约束由 NAS merge 端权威 schema 重建)。
用法:
python export_table.py --db PATH --out out.db --table constituent_unified
"""
import argparse
import os
import sqlite3
def main():
ap = argparse.ArgumentParser(description="全量导出单张小表到独立 sqlite")
ap.add_argument("--db", required=True, help="源 quant_trading.db 路径")
ap.add_argument("--out", required=True, help="输出 sqlite 路径")
ap.add_argument("--table", required=True, help="表名")
args = ap.parse_args()
tbl = args.table
conn = sqlite3.connect("file:%s?mode=ro" % args.db, uri=True)
cur = conn.cursor()
exists = cur.execute(
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (tbl,)
).fetchone()
if not exists:
raise SystemExit("table not found in source db: %s" % tbl)
if os.path.exists(args.out):
os.remove(args.out)
cur.execute("ATTACH DATABASE ? AS inc", (args.out,))
cur.execute(
"CREATE TABLE inc.[%s] AS SELECT * FROM main.[%s]" % (tbl, tbl)
)
n = cur.execute("SELECT COUNT(*) FROM inc.[%s]" % tbl).fetchone()[0]
conn.commit()
conn.close()
print("EXPORTED table=%s rows=%d sizeMB=%.2f -> %s"
% (tbl, n, os.path.getsize(args.out) / 1048576.0, args.out))
if __name__ == "__main__":
main()