ThinkPHP 8.1 不执行 SQL 文件,需用 mysql 命令手动导入;DB_DATABASE 必须为已存在的纯库名(如cardgame),不可填 SQL 文件路径,否则报“Unknown database”;导入前须确保用户对目标库拥有 CREATE、INSERT、DROP、ALTER 等完整权限。

ThinkPHP 8.1 本身不执行 SQL 文件,它只连接数据库并运行 PHP 中构造的查询。所谓“执行 SQL 文件”,实际是把 .sql 文件内容导入 MySQL 数据库——这一步必须由外部工具完成,而权限验证就发生在这之前和过程中。
确认数据库用户对目标库有完整操作权限
SQL 文件通常含 CREATE TABLE、INSERT、DROP 等语句,因此导入用户不能只有 SELECT 权限。登录 MySQL 后执行:
-
SHOW GRANTS FOR 'your_user'@'localhost';(替换为你的用户名和 host) - 重点检查是否包含
CREATE、INSERT、DROP、ALTER权限,且作用域是目标库(如ON `cardgame`.*),不是ON *.*或空 - 若缺失,用 root 执行:
GRANT CREATE, INSERT, DROP, ALTER ON cardgame.* TO 'your_user'@'localhost'; FLUSH PRIVILEGES;
验证 DB_DATABASE 配置是否为真实存在的库名
ThinkPHP 的 DB_DATABASE 必须是已创建的数据库名称(如 cardgame),不是 SQL 文件路径。常见错误是误填成 D:\data\init.sql,PDO 会把它当库名去连,报 Unknown database 'D:\data\init.sql'。
- 先登录 MySQL:执行
mysql -u root -p,再输入SHOW DATABASES;,确认列表里有你配置的库名 - 检查
.env或database.php中DB_DATABASE=cardgame—— 不带引号、不带路径、不带后缀 - 若库不存在,手动创建:
CREATE DATABASE cardgame CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
用 mysql 命令导入时验证权限是否生效
导入过程本身就会暴露权限问题。使用标准命令导入,并观察错误类型:
立即学习“PHP免费学习笔记(深入)”;
- 成功导入:
mysql -u your_user -p cardgame - 若报
Access denied for user 'your_user'@'localhost' to database 'cardgame'→ 用户无该库权限 - 若报
Table 'cardgame.users' doesn't exist→ 库存在但表结构未建(SQL 文件可能没执行完或含语法错) - 若报
ERROR 1044 (42000)→ 权限不足,需补授相应 DDL/DML 权限
ThinkPHP 连接后做一次简单写入测试
导入完成后,别急着跑业务逻辑。在控制器中加一段最小验证代码,确认框架能真正读写:
-
$result = Db::query('SELECT COUNT(*) FROM users');→ 测试可读 -
$id = Db::insertGetId(['name' => 'test', 'create_time' => time()]);→ 测试可写(确保表有自增主键) - 若写入失败且报错含
INSERT command denied→ 权限未落实到具体表,需检查GRANT ... ON cardgame.users级别



















