laravel配置sqlite需四步:一、.env中仅保留db_connection=sqlite和db_database(绝对路径),删光db_host等冗余项;二、手动创建database/database.sqlite并设664权限,确保web服务器用户可读写;三、pdo连接必须用database_path()或__dir__拼绝对路径;四、测试用:memory:需在phpunit.xml中配置env且sqlite连接块不硬编码database值。

直接用 SQLite 是本地开发最省事的选择,但配置错一步就 unable to open database file 或迁移失败,根本连不上。
DB_CONNECTION=sqlite 之后必须删掉其他 DB_XXX 配置
SQLite 不需要主机、端口、用户名和密码。如果 .env 里还留着 DB_HOST、DB_USERNAME 等字段,Laravel 仍会尝试读取它们——哪怕没用,也可能干扰连接初始化逻辑(尤其在某些 Laravel 版本或自定义连接场景下)。
-
DB_CONNECTION=sqlite是唯一必需项 - 把
DB_HOST、DB_PORT、DB_USERNAME、DB_PASSWORD全部删掉或注释掉 - 只保留
DB_DATABASE(指向文件路径)和可选的DB_FOREIGN_KEYS=true
database/database.sqlite 文件必须存在且有写权限
Laravel 默认期望数据库文件在 database/database.sqlite,但这个文件不会自动创建。PHP 进程需要能写入该路径,否则第一次迁移或写操作就会失败。
- 手动创建:
touch database/database.sqlite(在项目根目录执行) - 设权限:
chmod 664 database/database.sqlite(Nginx/Apache 用户需属于同一组) - 确认 web 服务器用户(如
www-data或_www)对该文件有读写权 - 别把
.sqlite文件放public/下——可能被直接下载
手动 new PDO('sqlite:xxx') 时路径必须是绝对路径
在控制器或命令中直接用 PDO 连接 SQLite,写 sqlite:database.sqlite 几乎必报错。因为 PHP 工作目录通常是 public/ 或项目根目录,不是你代码所在位置。
- ❌ 错误:
new PDO('sqlite:database.sqlite')(相对路径,找不到) - ✅ 正确:
new PDO('sqlite:' . database_path('database.sqlite')) - ✅ 或:
new PDO('sqlite:' . __DIR__ . '/database.sqlite')(仅限该文件同级有 db) - 注意:扩展名统一用小写
.sqlite,文件系统区分大小写时.SQLITE会打不开
测试环境用 :memory: 要改 phpunit.xml,不是 .env
想让测试跑在内存 SQLite 上,光改 .env.testing 没用——PHPUnit 启动时优先读 phpunit.xml 里的 <env></env> 块。
- 在
phpunit.xml的<php></php>节点内加两行:<env name="DB_CONNECTION" value="sqlite"></env><env name="DB_DATABASE" value=":memory:"></env> - 确保
config/database.php中sqlite连接块没硬编码'database' => ...,否则会覆盖:memory: -
RefreshDatabasetrait 才能生效;它依赖这个内存连接做事务级隔离
SQLite 在 Laravel 里最坑的从来不是功能少,而是路径、权限、配置残留这三件事藏得深——出问题时错误信息不指向根源,得一个个排除。











