Misaka_Company
|
0750f4c41d
|
日志按天管理:新增 DailyFileHandler 自动归档历史日志
需求:每天一个日志;历史日志重命名加时间戳后缀并归档;
日志根目录只保留当天文件;已产生的日志全部放进根目录下的
Archive 文件夹。
实现(src/runner.py):
- 新增 DailyFileHandler(logging.FileHandler):
· 当天写入 <log_dir>/sync.log(根目录只留当天文件)。
· 跨天或进程启动时,旧 sync.log 重命名为 sync_YYYYMMDD.log
并移入 <log_dir>/Archive/ 归档。
· emit 时若日期变化自动滚动;额外提供 maybe_rollover()
供主循环每轮主动检查,保证跨天必切(即使本轮无日志输出)。
- setup_logging 改为幂等:清掉已有 handler 再添加,避免重复日志行
(此前 setup_logging 被多次调用会产生重复行,现已免疫)。
- main 循环每轮调用 maybe_rollover,跨天切换时记一行
“日志已切换到新的一天,旧日志归档至 Archive/”。
验证:本地 4 项单测全绿(启动归档旧文件 / 当天写入 /
跨天主动滚动 / 同天不滚动)。
|
2026-07-16 09:22:56 +08:00 |
|
Misaka_Company
|
5e3c5d5b31
|
修复 169 源文件瞬态导致的 “File is not a zip file”
根因:源 Excel 常被打开/保存,download 在拷贝瞬间抓到 0 字节或
残缺文件,openpyxl 解析即报 “File is not a zip file”;且 runner 在
download 之后、parse 之前就无条件 save_baseline,把 size=0 的瞬态
源记成 “已处理”,污染基线。
修复:
- source_watcher.download:下载后校验(非空 + ZIP 头 PK),不合法
则删除并重试(默认 3 次,间隔 3s 等待源落盘)。
- source_watcher.has_changed:源不可达时优雅跳过本轮(WARNING),
不再每轮刷 traceback(169 间歇不可达为已知问题)。
- runner.run_once:save_baseline 移到整轮(解析+写库)成功之后,
杜绝把损坏/瞬态源记为已处理。
|
2026-07-15 16:53:37 +08:00 |
|
Misaka_Company
|
85ae96557e
|
修复 Access CSV 导入 -5402:schema.ini 改用 ASCII 字段名(F1..Fn)
根因:真实 114 生产表为中文列名,schema.ini 里写中文列名(如
Col2=物料编码 Text Width 255)被 Text ISAM 按系统 ANSI 解析,与
UTF-8 数据的 CharacterSet=65001 冲突,导致 -5402 ColN 选项无效
(本地 ADOX 测试表为 ASCII 列名故未复现)。
修复:schema.ini 字段名一律改为 ASCII(F1,F2,...),真实中文列名
只保留在 INSERT/SELECT 的 SQL 中(走 ODBC Unicode,无编码问题)。
类型仍只用 Text ISAM 永远合法的 DateTime / Text Width 255。
SCHEMA_INI_DUMP 诊断降级为 DEBUG 级别(生产日志默认不打印)。
|
2026-07-15 16:36:18 +08:00 |
|
Misaka_Company
|
19c04f2326
|
加固 Access CSV 导入的 schema 类型映射,杜绝 -5402 非法选项
- _schema_type 只可能输出两种 Access Text ISAM 永远接受的合法值:
日期/时间列 -> DateTime;其余(文本/数值/布尔) -> Text Width 255
(插入时 Access 按目标列真实类型自动强制转换,无需精确声明)
- 删除不再使用的 _TYPE_MAP 死代码
- 修正一处误删导致的缩进错误
- 本地集成测试(真实 sync_access, 35043 行, 含 GBK 外字符 ø)通过
|
2026-07-15 16:17:56 +08:00 |
|
Misaka_Company
|
7c849883e4
|
修复 Access CSV 导入编码:数据 UTF-8 + schema.ini cp936
- 真数据含 GBK 外字符(如 ø),原 cp936 写 CSV 触发 UnicodeEncodeError
- 数据 CSV 改 UTF-8 + schema.ini CharacterSet=65001(覆盖全部 Unicode)
- schema.ini 列名是中文,Access Text ISAM 按系统 ANSI(cp936) 读 ini,故 ini 仍用 cp936 写(仅数据文件用 UTF-8)
- _schema_type 列宽为 None 时兜底 255(规避 Text Width 0 非法)
- 本地集成测试(真实 sync_access, 35043 行, 含 ø)通过:行数+校验和一致
|
2026-07-15 16:09:49 +08:00 |
|
Misaka_Company
|
5de1d4ee51
|
优化 Access 全量写入:executemany 改为 CSV+Text 驱动单语句批量导入
- 根因:ACE/Jet 的 executemany 在网络盘(E:)上逐行落地,每行一次往返,35043 行约 10 分钟
- UNION ALL 参数化受 Jet 查询复杂度上限封死(查询过于复杂 -3071),不可用
- 改用官方 Text 导入路径:写入临时 Tab 分隔 CSV(GBK/cp936) + 动态 schema.ini,单条 INSERT...SELECT FROM [Text;...] 整批写入,往返从 35043 次压成 1 次
- 保留正确性保障:列约束值清洗(截断/夹日期) + 写入后 COUNT(*) 核对 + 不足时逐行回退并精确记录失败行
- 本地集成测试(真实 sync_access,35043 行)通过:行数+校验和完全一致
|
2026-07-15 16:03:12 +08:00 |
|
Misaka_Company
|
eecea44746
|
修复 Access 全量同步静默丢行问题
- sync_access 改为事务化(去 autocommit,失败回滚),杜绝前段已提交、错误被吞导致日志谎报完成
- 写入前按 Access 列约束做值清洗:VARCHAR 按列宽截断、DATETIME 夹到合法范围,从根消除驱动拒写
- 写入后强制 SELECT COUNT(*) 核对实际行数;不足则 DELETE 后逐行回退插入并精确记录失败行号
- 修复后两端均落 35043 行,SQL Server 与 Access 校验和一致
|
2026-07-15 15:31:24 +08:00 |
|
Misaka_Company
|
5ae7acffde
|
初始化项目:数据同步服务源码与文档
- src: config_loader / source_watcher / excel_parser / sync_writer / runner
- 169 Excel 全量同步至 114 SQL Server + Access 生产库
- 新增 .gitignore(忽略 venv、日志、数据、含凭据的 config.yaml 等)
- 新增 README.md(用途、安装、配置、运行模式、部署说明)
|
2026-07-15 14:14:39 +08:00 |
|