[开发]清除 SQLite 残留代码计划

👑Lv.11 元老 🌞 骨干会员
2026-10-24 00:02:13

本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:暂存20260913/docs/清除sqlite代码计划.md。

清除 SQLite 残留代码计划

背景:SoSite 4.0.0 之前支持 SQLite + MySQL 双数据库,4.0.0 后改为仅 MySQL。

以下列出所有残留的 SQLite 相关代码,评估清除难度和方案。


一、核心文件残留(3 处)

1.1 app/Core/Database.php

行号代码说明
84-90getDbType() 方法始终返回 'mysql',为插件兼容保留
100-102INSERT OR IGNORE / INSERT OR REPLACE 替换SQLite 语法→MySQL 语法兼容

清除方案:

  • 删除 getDbType() 方法(方法体仅一行 return 'mysql',无实际价值)
  • 删除 str_replace('INSERT OR IGNORE INTO', ...) 的两行兼容代码

难度:⭐ 极低,删 3 行代码

影响:需要确认没有其他地方调用 getDbType()(核查结果见下文,有 3 个地方调用)


1.2 app/Controllers/Admin/DashboardController.php

行号代码说明
25'dbType' => 'mysql',硬编码,传递给模板显示

清除方案:直接删除该行,模板中对应位置也移除"数据库类型"显示(或改为固定显示"MySQL")

难度:⭐


1.3 app/Controllers/Admin/DatabaseController.php

行号代码说明
18$dbType = 'mysql';硬编码变量
72'dbType' => $dbType传给模板
354-355CHARSET=utf8 → utf8mb4 替换兼容 SQLite 导入的 SQL 文件

清除方案:

  • 删除 $dbType 变量,模板中改为固定显示"MySQL"
  • 保留 CHARSET=utf8 → utf8mb4 替换(这是 SQL 导入时的兼容处理,用于导入旧版 SQLite 备份,保留无害)

难度:⭐


1.4 app/Controllers/Admin/MaintenanceController.php

行号代码说明
90'dbType' => 'mysql'传给模板,控制全文索引重建方式

清除方案:删除该行,模板中 dbType 默认值改为 'mysql' 即可

难度:⭐


1.5 app/Views/admin/database.php

行号代码说明
10$dbType = $this->getData('dbType');接收数据库类型
51<td><?php echo $this->e($dbType); ?></td>显示类型

清除方案:类型行改为固定显示 MySQL

难度:⭐


1.6 app/Views/admin/index.php

行号代码说明
99数据库: <?php echo $this->e($stats['dbType'] ?? 'sqlite'); ?>默认值 sqlite 是旧代码

清除方案:默认值改为 'mysql',或直接显示 'MySQL'

难度:⭐


1.7 app/Views/admin/maintenance.php

行号代码说明
12$dbType = $this->getData('dbType', 'sqlite');默认值 sqlite

清除方案:默认值改为 'mysql'

难度:⭐


二、插件残留(5 个插件)

2.1 plugins/daily_checkin/hook/init_after.php ⚠️ 最复杂

行号代码说明
11$dbType = $db->getDbType();获取数据库类型判断分支
15-38if ($dbType === 'mysql') { ... }MySQL 分支
40-58else { ... }SQLite 分支:sqlite_master 查询、INTEGER PRIMARY KEY AUTOINCREMENT、TEXT 类型

清除方案:删除整个 else 分支(SQLite 代码),if 条件删除,保留 MySQL 分支代码

难度:⭐⭐ 中等

代码量:约 20 行


2.2 plugins/dev_docs/AdminController.php

行号代码说明
115$dbType = Database::getInstance()->getDbType();获取类型
117($dbType === 'mysql' ? ", updated_at = NOW()" : ", updated_at = datetime('now','localtime')")三元运算分支

清除方案:直接写 updated_at = NOW(),删除三元运算

难度:⭐


2.3 plugins/dev_docs/Plugin.php ⚠️ 最复杂

行号代码说明
24$dbType = $db->getDbType();获取类型
26-49if ($dbType === 'mysql') { ... } else { ... }建表 SQL 分支:MySQL 用 AUTO_INCREMENT,SQLite 用 AUTOINCREMENT
52self::insertDefaultData($db, $dbType);传参
74insertDefaultData($db, $dbType)方法签名
1066-1069if ($dbType === 'mysql') { ... } else { ... }插入数据时分两种方式

清除方案:

  • 删除 else 分支(SQLite 建表 SQL)
  • 方法签名去掉 $dbType 参数
  • 仅保留 MySQL 分支代码

难度:⭐⭐ 中等

代码量:约 15 行


2.4 plugins/qa/Plugin.php

行号代码说明
21$dbType = $db->getDbType();获取类型
23-80if ($dbType === 'mysql') { ... } else { ... }建表 SQL 分支(5 张表)
81-120else { ... }SQLite 建表代码

清除方案:删除整个 else 分支,if 条件删除,保留 MySQL 建表代码

难度:⭐⭐ 中等

代码量:约 40 行


2.5 plugins/invite/hook/init_after.php

行号代码说明
23ENGINE=InnoDB DEFAULT CHARSET=utf8mb4建表 SQL 已使用 MySQL 语法,无 SQLite 分支

实际上没有 SQLite 残留,只是建表语句用了 MySQL 引擎语法,这在 MySQL-only 下是正常的。无需修改。


三、仅文档描述残留(不影响功能)

3.1 plugins/dev_docs/Plugin.php 中的文档内容

行号内容
84文档中写"支持 SQLite 和 MySQL 双数据库后端"
97文档中写"双数据库 — 同时支持 SQLite 和 MySQL"
212环境要求表写"SQLite 3 或 MySQL 5.7+"
213写"PDO + SQLite/MySQL"
219写"默认使用 SQLite 数据库"
227-228配置示例中写 DB_TYPE 和 DB_PATH
246安装说明中提及 SQLite WAL 清理
248文档中写"SQLite 无需额外导入"
303文档中写 protected/forum.db SQLite 数据库文件
311文档 FAQ 中 SQLite 问题
441-444全文搜索技术原理中写 SQLite FTS5
503数据库大小说明中写"SQLite 文件大小"
668数据库信息中写"数据库路径(SQLite)"
671备份说明中写 SQLite 备份方式
674导入说明中写 SQLite 导入方式
677优化说明中写 SQLite VACUUM
682重建索引中写 SQLite FTS5

清除方案:这些是 dev_docs 插件中存储的文档内容(HTML),存储在 doc_pages 表的 content 字段中。修改方式:

  • 更新 Plugin.php 中 insertDefaultData() 方法里的文档内容 HTML
  • 或直接在后台编辑文档页面删除 SQLite 相关内容

难度:⭐⭐ 中等(字符串量大,但无技术难度)


四、config.php 中的残留

当前 config.php 中仍有 DB_TYPE 常量定义:

define('DB_TYPE', 'mysql');

但实际代码中没有任何地方读取 DB_TYPE,数据库连接是硬编码的 MySQL。这个常量可以保留(作为标识),也可以删除。

建议:保留,无危害。


五、Database.php 中的 SQLite 兼容注释

query() 方法中的注释:

// SQLite → MySQL 语法兼容替换(为插件代码兼容,如 qa 插件使用 INSERT OR IGNORE)

清除后应改为:

// MySQL-only,无需兼容替换


六、工作量汇总

文件难度修改类型预计时间
app/Core/Database.php⭐删 3 行 + 改注释5 分钟
app/Controllers/Admin/DashboardController.php⭐删 1 行2 分钟
app/Controllers/Admin/DatabaseController.php⭐删 2 行2 分钟
app/Controllers/Admin/MaintenanceController.php⭐删 1 行2 分钟
app/Views/admin/database.php⭐改 1 行2 分钟
app/Views/admin/index.php⭐改 1 行1 分钟
app/Views/admin/maintenance.php⭐改 1 行1 分钟
plugins/daily_checkin/hook/init_after.php⭐⭐删约 20 行 SQLite 分支10 分钟
plugins/dev_docs/AdminController.php⭐删三元运算2 分钟
plugins/dev_docs/Plugin.php⭐⭐删 SQLite 分支 + 改方法签名15 分钟
plugins/qa/Plugin.php⭐⭐删 SQLite 分支(5 张表)15 分钟
plugins/dev_docs/Plugin.php 文档内容⭐⭐更新文档 HTML 中 SQLite 描述15 分钟
总计12 个文件约 1 小时

七、清除原则

  1. 只删 SQLite 分支代码,不影响 MySQL 功能
  2. 每个文件单独改,改完 php -l 验证语法
  3. 文档内容(dev_docs 中的 HTML)可以最后处理,不影响功能
  4. 先改核心文件,再改插件文件

八、操作顺序建议

第 1 步:核心文件(5 个)
  Database.php → DashboardController.php → DatabaseController.php → MaintenanceController.php

第 2 步:后台视图(3 个)
  admin/database.php → admin/index.php → admin/maintenance.php

第 3 步:插件(3 个)
  daily_checkin/init_after.php → dev_docs/AdminController.php → dev_docs/Plugin.php → qa/Plugin.php

第 4 步:文档内容(可选)
  dev_docs/Plugin.php 中的文档 HTML

等指令再动手。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 1 次 | 回复 0 次

全部回复 (0)

暂无回复

请 登录