certflow.utils package¶
Submodules¶
- certflow.utils.access_db module
is_access_enabled()AccessDatabaseAccessDatabase.query()AccessDatabase.get_unsigned_records()AccessDatabase.get_signed_records()AccessDatabase.get_next_unsigned()AccessDatabase.get_by_id()AccessDatabase.search()AccessDatabase.get_fields()AccessDatabase.get_customer_stats()AccessDatabase.get_model_stats()AccessDatabase.get_statistics()AccessDatabase.append_signed_records_to_form()AccessDatabase.export_to_csv()AccessDatabase.close()AccessDatabase.__enter__()AccessDatabase.__exit__()
AccessDatabaseManagerget_access_db()get_access_db_new()
- certflow.utils.database module
NutstoreWebDAVConfigDatabaseManagerDatabaseManager.db_pathDatabaseManager.engineDatabaseManager.SessionLocalDatabaseManager.webdav_configDatabaseManager.init_db()DatabaseManager.ensure_initialized_if_needed()DatabaseManager.warn_if_base_data_empty()DatabaseManager.commit_with_retry()DatabaseManager.flush_with_retry()DatabaseManager.pull_from_webdav()DatabaseManager.push_to_webdav()DatabaseManager.sync_with_webdav()DatabaseManager.check_remote_status()DatabaseManager.get_session()DatabaseManager.close()
- certflow.utils.date_utils module
- certflow.utils.id_generator module
IDGeneratorIDGenerator.generate_certificate_no()IDGenerator.generate_unique_key()IDGenerator.generate_unique_key_readable()IDGenerator.generate_identity_key()IDGenerator.generate_change_signature()IDGenerator.normalize_spec()IDGenerator.normalize_pn()IDGenerator.generate_batch_unique_keys()IDGenerator.normalize_empty_values()IDGenerator.normalize_dataframe_empty_values()IDGenerator.get_all_unique_key_fields()
- certflow.utils.logger module
- certflow.utils.path_utils module
- certflow.utils.retry module
- certflow.utils.status_inference module
Module contents¶
工具模块
提供数据库管理和日志配置等核心工具类与函数。 是CertFlow系统基础架构的重要组成部分。
- class certflow.utils.DatabaseManager(db_path=None, webdav_config=None, auto_backup_before_sync=True)[源代码]¶
基类:
object数据库管理器
管理数据库引擎、会话工厂和表创建,提供统一的数据库操作入口。 支持数据库初始化、表迁移(自动补齐缺失列)和会话管理。 支持从WebDAV服务器同步数据库文件。
- 参数:
db_path (str | None)
webdav_config (NutstoreWebDAVConfig | None)
auto_backup_before_sync (bool)
- db_path¶
数据库文件路径
- engine¶
SQLAlchemy引擎实例,负责数据库连接
- SessionLocal¶
会话工厂实例,用于创建数据库会话
- webdav_config¶
WebDAV配置(如果启用)
示例
>>> from certflow.utils.database import DatabaseManager >>> >>> # 创建数据库管理器 >>> db = DatabaseManager("path/to/database.db") >>> >>> # 初始化数据库 >>> db.init_db(create_tables=True) >>> >>> # 从WebDAV拉取数据库 >>> webdav_config = NutstoreWebDAVConfig( ... url="https://dav.jianguoyun.com/dav/", ... username="user@example.com", ... password="app_password" ... ) >>> db.init_db(sync_from_webdav=True) >>> >>> # 获取会话并执行操作 >>> session = db.get_session() >>> try: ... result = session.query(SalePlan).all() ... finally: ... session.close()
- init_db(create_tables=True, sync_from_webdav=False, force_sync=False)[源代码]¶
初始化数据库
创建数据库目录、SQLAlchemy引擎和会话工厂, 可选创建所有数据表。已有表会自动补齐缺失列。 可选从WebDAV同步数据库文件。
- 参数:
- 抛出:
Exception -- 当数据库初始化失败时抛出异常
- 返回类型:
None
示例
>>> db = DatabaseManager("test.db") >>> db.init_db(create_tables=True) >>> print("数据库初始化完成")
- ensure_initialized_if_needed()[源代码]¶
仅在引擎尚未创建时初始化数据库(幂等、低开销)
供装配层(
BaseController/AppContext)在「不确定当前是否已完成 引导」的构造路径上调用:已初始化则直接跳过,未初始化则补建表/迁移。 区别于init_db的「总是执行完整初始化」,本方法避免在每次 Controller 构造时重复跑建表与迁移流程。- 返回类型:
None
- warn_if_base_data_empty()[源代码]¶
检查基础字典底座是否为空,为空则给出 seed 提示(只读、不自动播种)。
对应
DATABASE_BASE_DATA.md §4.2的「可选加固」:在init_db之后挂载 一个轻量检查——若material_grades/model_param_mappings/caliber_mappings任一为空,记录 WARNING 并提示运行scripts/data/seed_base_data.py。刻意**不**自动播种(§4.2 明确「不要每次启动自动 seed」,避免依赖 xlsx / 拖慢启动);自动播种由
main._maybe_seed_base_data在 GUI 启动路径单独负责。 CLI / 双库等不走自动播种的入口调用本方法即可获得「空库提示」安全网。- 返回:
字典表是否为空(True=空,需 seed)。
- 返回类型:
- static commit_with_retry(session, max_attempts=12)[源代码]¶
带退避重试的 session.commit,专治瞬时写锁。
直接在业务 session 上调用,遇
database is locked时指数退避 重试(base 0.05s / 上限 0.8s / 累计约 8s)。配合 WAL+busy_timeout 使用,几乎可消除打印流程中的写保护锁现象。
- class certflow.utils.AccessDatabase(db_path, max_retries=3, keep_alive=True)[源代码]¶
基类:
objectAccess 数据库管理器
专门用于连接和查询 Access 数据库,独立于主 SQLite 数据库。 支持连接复用,避免频繁开关连接。
示例
>>> # 推荐:使用上下文管理器(自动管理连接) >>> with get_access_db() as db: ... records = db.search(customer="宁波大隆")
>>> # 或:获取全局单例(保持连接) >>> db = get_access_db() >>> records = db.search(customer="宁波大隆")
- get_signed_records(top_n=10)[源代码]¶
查询已刻印的记录
- 参数:
top_n (int) -- 返回的记录数,默认为 10。
- 返回:
已刻印记录的 DataFrame,按 ID 降序排列。
- 返回类型:
pd.DataFrame
- get_by_id(record_id)[源代码]¶
根据ID查询记录
- 参数:
record_id (int) -- 记录的主键 ID。
- 返回:
匹配记录的 DataFrame。
- 返回类型:
pd.DataFrame
- search(customer=None, project=None, model=None, sn=None, signed=None)[源代码]¶
多条件搜索
- 参数:
- 返回:
符合所有条件的记录 DataFrame,按 ID 降序排列。
- 返回类型:
pd.DataFrame
- certflow.utils.get_access_db()[源代码]¶
获取 Access 数据库连接实例(复用全局连接)
推荐使用此函数获取连接,内部会自动管理连接生命周期。 适用于需要频繁查询的场景。
- 返回:
实例(全局单例)。
- 返回类型:
- 抛出:
ImportError -- Access 功能被配置禁用时抛出。
- certflow.utils.is_access_enabled()[源代码]¶
检查 Access 功能是否启用
优先级:环境变量 > 配置文件 > 默认禁用
- 返回:
True 如果 Access 功能已启用
- 返回类型:
- certflow.utils.setup_logger(log_path='logs/certflow.log', console_level='INFO', file_level='DEBUG', debug_modules=None)[源代码]¶
配置日志系统(兼容旧接口)
提供简化的函数式接口,用于快速配置日志系统。
- 参数:
- 返回:
配置好的日志实例
- 返回类型:
loguru.Logger
示例
>>> from certflow.utils.logger import setup_logger >>> >>> # 使用默认配置 >>> logger = setup_logger() >>> >>> # 自定义配置 >>> logger = setup_logger( ... log_path="logs/app.log", ... console_level="DEBUG", ... file_level="INFO" ... ) >>> logger.info("应用启动成功")
- certflow.utils.get_logger()[源代码]¶
获取全局日志实例
获取已配置的全局日志实例,如果尚未配置则使用默认配置。
- 返回:
全局日志实例
- 返回类型:
loguru.Logger
示例
>>> from certflow.utils.logger import get_logger >>> >>> logger = get_logger() >>> logger.info("这是一条信息日志") >>> logger.error("这是一条错误日志")
- certflow.utils.extract_yymm_from_date(plan_date)[源代码]¶
从计划日期提取 YYMM 格式(后两位年份+两位月份)
先通过 normalize_plan_date 统一格式化为 YYYY-MM-DD, 再从中提取年份后两位和月份。