本文由 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-90 | getDbType() 方法 | 始终返回 'mysql',为插件兼容保留 |
| 100-102 | INSERT 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-355 | CHARSET=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-38 | if ($dbType === 'mysql') { ... } | MySQL 分支 |
| 40-58 | else { ... } | 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-49 | if ($dbType === 'mysql') { ... } else { ... } | 建表 SQL 分支:MySQL 用 AUTO_INCREMENT,SQLite 用 AUTOINCREMENT |
| 52 | self::insertDefaultData($db, $dbType); | 传参 |
| 74 | insertDefaultData($db, $dbType) | 方法签名 |
| 1066-1069 | if ($dbType === 'mysql') { ... } else { ... } | 插入数据时分两种方式 |
清除方案:
- 删除
else分支(SQLite 建表 SQL) - 方法签名去掉
$dbType参数 - 仅保留 MySQL 分支代码
难度:⭐⭐ 中等
代码量:约 15 行
2.4 plugins/qa/Plugin.php
| 行号 | 代码 | 说明 |
|---|---|---|
| 21 | $dbType = $db->getDbType(); | 获取类型 |
| 23-80 | if ($dbType === 'mysql') { ... } else { ... } | 建表 SQL 分支(5 张表) |
| 81-120 | else { ... } | SQLite 建表代码 |
清除方案:删除整个 else 分支,if 条件删除,保留 MySQL 建表代码
难度:⭐⭐ 中等
代码量:约 40 行
2.5 plugins/invite/hook/init_after.php
| 行号 | 代码 | 说明 |
|---|---|---|
| 23 | ENGINE=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 小时 |
七、清除原则
- 只删 SQLite 分支代码,不影响 MySQL 功能
- 每个文件单独改,改完
php -l验证语法 - 文档内容(dev_docs 中的 HTML)可以最后处理,不影响功能
- 先改核心文件,再改插件文件
八、操作顺序建议
第 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等指令再动手。