feat: 数据库连接层改造——库目标由 .env 装配 + 环境防呆(迁 MySQL 第一步)
为把数据库从单文件 SQLite 迁到 MySQL 5.7 铺路。本期不改后端: DB_HOST 为空时仍走 SQLite,本地开发无感。 - config.py: 新增 DEPLOY_ENV(默认 dev)与 DB_HOST/PORT/USER/PASSWORD/NAME/ CHARSET/COLLATION、DATABASE_URL、两个逃生阀(DB_ALLOW_ENV_MISMATCH / DB_ALLOW_SQLITE_FALLBACK) - core/db_config.py(新增): URI 组装;按方言分叉的引擎参数(utf8mb4、 pool_pre_ping、pool_recycle=1800、READ COMMITTED、STRICT_TRANS_TABLES); 连接探活;app_meta 方言中立读写(MySQL 里 key 是保留字,需反引号) - 防混库三层: ①库名与环境绑定(dev→auto_control_dev / prod→auto_control) ②库标签 app_meta.deployment_env 与 .env 声明比对 ③启动横幅打印当前库 (生产用 WARNING 级)。不符直接拒绝启动并说明两边分别是什么 - web_server.py: 硬编码 sqlite URI → db_config;配置错在装配期就 exit 2; init_db 之后跑库标签校验 + 横幅 - core/models.py: PRAGMA 监听器加 sqlite 类型守卫——它挂在 Engine 基类上, MySQL 连接执行 PRAGMA 会直接导致建连失败 - requirements.txt 加 PyMySQL;scripts/start.sh 依赖守卫加 pymysql, 并在 exec 前打印 DEPLOY_ENV/DB_NAME/DB_HOST - .env.example 新增「数据库」段;DEVELOPMENT.md §4.1/4.2、DEPLOY.md §2.2 同步 验证: 用 DATABASE_URL 指向 users.db 的一致快照副本跑通主要只读接口 (health/devices/jobs/pool/groups/discovery/summary 全 200,app_meta 读写正常); DEPLOY_ENV=prod 且无 DB_HOST 时退出码 2;开 DB_ALLOW_SQLITE_FALLBACK 后可回退。
This commit is contained in:
@@ -7,6 +7,33 @@
|
||||
# - 完整说明见 doc/DEVELOPMENT.md §4 配置速查、doc/DEPLOY.md §2.2
|
||||
# ==============================================================================
|
||||
|
||||
# ==================== 数据库 ====================
|
||||
# 平台用 MySQL(正式用法)。DEPLOY_ENV 声明"这份配置连的是哪个环境的库",
|
||||
# 并与库名一一绑定,启动时会互相校验,不符直接拒绝启动:
|
||||
# DEPLOY_ENV=dev → 期望库名 auto_control_dev(本地开发,可随意折腾)
|
||||
# DEPLOY_ENV=prod → 期望库名 auto_control (正式数据)
|
||||
# 首次连接的库会被打上环境标签(app_meta.deployment_env);标签与 DEPLOY_ENV
|
||||
# 不符时拒绝启动——这是防止「开发配置连到生产库」的最后一道闸。
|
||||
DEPLOY_ENV=dev
|
||||
DB_HOST=
|
||||
DB_PORT=3306
|
||||
DB_USER=
|
||||
DB_PASSWORD=
|
||||
DB_NAME=auto_control_dev
|
||||
# 排序规则用 _bin(逐码点比较,等价 SQLite 的大小写敏感语义),别改成 _general_ci
|
||||
DB_CHARSET=utf8mb4
|
||||
DB_COLLATION=utf8mb4_bin
|
||||
|
||||
# 完整连接串:优先级最高,用于脚本临时指向别的库(一般不用配)
|
||||
# DATABASE_URL=mysql+pymysql://user:pass@host:3306/auto_control_dev?charset=utf8mb4
|
||||
|
||||
# 逃生阀(默认关,仅在明确知道后果时打开)
|
||||
# DB_ALLOW_ENV_MISMATCH=1 环境与库名/库标签不符时仍启动(危险)
|
||||
# DB_ALLOW_SQLITE_FALLBACK=1 生产环境 DB_HOST 为空时允许回退 SQLite(回滚用)
|
||||
# DB_ALLOW_ENV_MISMATCH=0
|
||||
# DB_ALLOW_SQLITE_FALLBACK=0
|
||||
|
||||
|
||||
# ==================== Web 服务 ====================
|
||||
# 会话密钥【必须,生产务必固定】:不配则每次启动随机生成,重启后登录态失效。
|
||||
# 生成:python -c "import secrets; print(secrets.token_hex(32))"
|
||||
|
||||
Reference in New Issue
Block a user