这篇讲解 betalens_db_manager 的完整用法——从初始化 schema、导入数据、到 GUI 界面管理。学完这篇,你可以独立完成数据库从零到可用的全部操作,不需要依赖别人给你准备数据。
导言
betalens_db_manager 是 Betalens 生态里专门负责”数据进库”和”数据库维护”的模块。它的职责边界很清晰:
- 做:建库、Schema 管理、数据导入、任务记录、GUI 管理界面。
- 不做:运行时数据查询(那是
betalens.datafeed的事)。
这套工具对新手最友好的入口是命令行和 GUI;对开发者来说,知道 Python API 可以让你把导入流程自动化、流水线化。
核心模块一览
betalens_db_manager 对外暴露以下主要对象:
1 | from betalens_db_manager import ( |
通常不需要直接调用底层对象,用顶层的 DatabaseManager 即可。
一、初始化数据库:Schema 创建
方式一:一键脚本(推荐新手)
1 | cd C:\Users\Janis\OneDrive\betalens |
init_local.bat 会优先使用仓库的 .venv 中的 Python,找不到才用系统 Python。
方式二:命令行一步到位
1 | python -m betalens_db_manager init --yes |
--yes 跳过确认提示。init 会自动处理迁移版本(0001 ~ 0009),并保证 schema 版本一致性。
方式三:Python API
1 | from betalens_db_manager import DatabaseManager |
二、导入数据:ImportJobRunner
导入前准备
数据导入有两种主流来源:
- EDE 格式数据包(常见于券商资管、合规数据供应商)
- Wind 数据接口(通过
WindPython 模块拉取)
此外还支持:
- 指数成分:
index_universe模块导入中证/申万等指数成分 - 交易日历:
trade_calendar导入 - 自定义 CSV/Parquet:通过
ImportJobRunner通用入口
Wind 数据导入
1 | from betalens_db_manager import ImportJobRunner, ImportRecordStore |
EDE 数据包导入
1 | result = runner.run( |
指数成分导入
1 | from betalens_db_manager import DatabaseManager |
导入记录与防重
ImportRecordStore 用 SQLite 文件(logs/database-manager/jobs.sqlite3)记录每次导入的时间、表名、起止日期、记录数。下次再导入时,自动跳过已有时间段:
1 | # 第二次导入同一时间段,不会重复写入 |
三、冲突检测与数据回滚
1 | from betalens_db_manager import DatabaseClient |
四、GUI 管理界面
如果不想用命令行,betalens_db_manager 提供了 PySide6 图形界面:
1 | python -m betalens_db_manager gui |
界面包含:
- 连接管理:填写 host/port/dbname/user/password,连接测试。
- Schema 视图:查看当前数据库有哪些表、字段、数据量。
- 导入任务:拖拽文件或填入 Wind 参数,发起导入任务。
- 导入记录:查看历史导入、重复导入检测结果。
- 冲突管理:删除/覆盖冲突数据。
GUI 的连接信息只用于当前进程,不会写入本地文件,适合临时查询。
五、Migration 与版本控制
Betalens 的 Schema 通过版本化的 migration 文件管理(0001 ~ 0009 等)。每个 migration 有规范化 checksum(LF 格式):
init_local.bat执行时按顺序应用未执行的 migration。verify --deep会检测 checksum,如果数据库中的 migration 历史被篡改,会拒绝启动。- 从旧版本数据库升级时,
0009的早期阻断式 checksum 被允许兼容,平滑升级。 - 禁止 schema 降级——如果当前 schema 版本高于 migration 文件,框架会报错。
六、任务记录
所有导入任务都记录在 logs/database-manager/jobs.sqlite3 中:
1 | from betalens_db_manager import ImportRecordStore |
团队协作时,可以把这个 SQLite 文件也提交到仓库,确保大家有相同的导入历史记录。
常见错误
1. betalens_db_manager verify 报错 schema checksum 不匹配
原因:数据库被手动修改,或从备份恢复了旧版本。解决:
1 | # 删库重建(谨慎操作,会丢失所有数据!) |
2. 导入 Wind 数据报权限错误
检查 Wind Python 模块是否正确安装,以及数据库用户是否有写权限:
1 | GRANT ALL PRIVILEGES ON DATABASE datafeed TO your_user; |
3. jobs.sqlite3 锁死
如果上次导入异常中断,SQLite 文件可能被锁。删掉 logs/database-manager/jobs.sqlite3,重新导入(会丢失历史记录,但导入任务本身不受影响)。
4. GUI 连接失败
GUI 不会保存密码到文件,需要每次手动输入。如果忘了密码,用 pgAdmin 重置后再填入 GUI。
开发者侧:导入流水线的自动化
如果你的数据来源比较复杂(比如每天定时从多个数据源拉取并入库),可以写一个 Python 脚本做全自动化:
1 | from betalens_db_manager import DatabaseManager, ImportJobRunner, ImportRecordStore |
配合 Windows 任务计划程序或 Linux cron,可以每天定时跑一次。
延伸阅读
- Betalens 新手系列 · 03:从零安装——安装全程。
- Betalens 新手系列 · 05:数据库架构全图——15 张表详解。
- Betalens 新手系列 · 08:PostgreSQL 查询优化——索引与分区策略。
docs/guide/db-manager.rst——官方数据库管理文档。