b2aab85105
新增 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)。
49 lines
1.7 KiB
Python
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()
|