Laravel 13 配置 SQLite 报“unable to open database file”的核心原因有三:① .env 中残留 DB_HOST 等非 SQLite 配置导致 PDO 初始化异常;② DB_DATABASE 必须为绝对路径,且 database/database.sqlite 文件需手动创建并设 chmod 664、chown 正确用户;③ PDO 直连时未用 database_path() 拼接绝对路径,或扩展名大小写错误。

Mac 下 Laravel 13 配置 SQLite 最快能 2 分钟跑通,但错一步就卡在 unable to open database file 或迁移无声失败——核心问题从来不是“会不会”,而是路径、权限、配置残留这三处。
DB_CONNECTION=sqlite 后必须删光其他 DB_ 配置
Laravel 13.2.0(PHP 8.3+)读取 .env 时,哪怕 DB_CONNECTION=sqlite 已设,只要还留着 DB_HOST、DB_USERNAME 等字段,某些场景下(比如自定义连接或测试环境)PDO 初始化会尝试解析它们,导致连接逻辑异常或静默 fallback 到空连接。
- ✅ 正确做法:只保留这两行(
DB_FOREIGN_KEYS=true可选,但推荐)DB_CONNECTION=sqlite DB_DATABASE=/Users/yourname/code/myapp/database/database.sqlite
- ❌ 错误写法:
DB_HOST=127.0.0.1、DB_PORT=3306、DB_USERNAME=homestead全部删掉或注释掉 - 注意:Mac 上路径必须是绝对路径;用
database_path('database.sqlite')在代码里拼接没问题,但.env不支持函数调用,不能写DB_DATABASE=database_path(...)
database/database.sqlite 文件必须手动创建且权限正确
Laravel 从不自动创建 SQLite 文件,也不会报“文件不存在”,而是连接返回 false,后续迁移、查询全静默失败。Mac 默认用 _www(Apache)或 www-data(Homebrew Nginx)跑 PHP,但你终端用户是 yourname,权限不一致就会写入失败。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 在项目根目录执行:
mkdir -p database touch database/database.sqlite chmod 664 database/database.sqlite
- 确认 Web 服务器用户能写:
ls -l database/应显示类似-rw-rw-r-- 1 yourname staff 0 Sep 16 04:30 database.sqlite;若 Nginx 用户是_www,还需:sudo chown yourname:_www database/database.sqlite
- 别把
.sqlite放public/下——HTTP 可直接下载,泄露全部数据
用 PDO 直连 SQLite 时路径必须绝对,且扩展名小写
你在控制器或命令里手写 new PDO('sqlite:database.sqlite'),99% 会报错。因为 PHP 当前工作目录通常是 public/,而 database/ 在上层,相对路径根本找不到。
- ✅ 正确写法(任选其一):
new PDO('sqlite:' . database_path('database.sqlite')) // 或 new PDO('sqlite:' . __DIR__ . '/../database/database.sqlite') - ⚠️ 文件系统区分大小写:Mac 默认是 case-insensitive,但 APFS 卷可设为 case-sensitive;一旦启用,
database.DB或database.SQLITE都打不开,必须严格用小写.sqlite - 扩展需启用:
php -m | grep sqlite应输出pdo_sqlite;没看到?运行brew install php@8.3(Laravel 13 要求 PHP 8.3+),它自带该扩展
最易被忽略的点:Laravel 13 的 config/database.php 中 sqlite 连接块默认用 database_path('database.sqlite'),但它只是 fallback;.env 里的 DB_DATABASE 会完全覆盖它——所以你改了 .env 却忘了删其他 DB 配置,或者路径写成相对路径,php artisan migrate 就像没反应一样,其实早就连不上了。

















