sqlite适合本地原型、cli工具、小型后台等单机场景,开箱即用;不适用于高并发写入、多用户提交或需事务隔离的生产环境,误用将导致“database is locked”错误。

SQLite 适合开发、测试、单机工具类 Laravel 应用,不适合高并发、多用户写入或需要主从/事务隔离的生产环境。
哪些项目能直接用 SQLite 跑起来
本地快速原型验证、CLI 工具类 Laravel 应用(比如日志分析器、数据迁移脚本)、小型内部管理后台(dcatadmin 类)、学生作业或教学演示项目——这些场景下 sqlite 配置简单、零运维、文件即数据库,开箱即用。
常见错误现象:上线后突然报 SQLSTATE[HY000]: General error: 5 database is locked,基本就是误把 SQLite 当 MySQL 用在了多人同时提交表单的场景里。
- SQLite 不支持真正的并发写入,同一时刻只允许一个写操作
- 没有用户权限系统、无网络访问层,无法做连接池或读写分离
- 不支持外键约束默认开启(需手动在
config/database.php中设'foreign_key_constraints' => true)
配置时容易漏掉的三件事
很多人配完 DB_CONNECTION=sqlite 就以为完了,结果运行 php artisan migrate 报错或外键不生效。
- 必须用绝对路径填
DB_DATABASE,比如/var/www/myapp/database/database.sqlite,不能只写database.sqlite - 要确保
database/目录和.sqlite文件都有www-data(Nginx)或_www(Mac)写权限 - 若要用外键(比如 Eloquent 的
belongsTo关联),得在config/database.php的sqlite配置块里显式打开:'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),并确保.env里没把它关掉
什么时候该换 MySQL 或 PostgreSQL
只要出现以下任一信号,就该立刻停用 SQLite:
- 用户量 > 50 且有频繁表单提交(注册、订单、评论)
- 需要定时任务(
scheduler)或队列(queue)持久化 job 记录 - 要求支持行级锁、可重复读隔离级别、在线 DDL 变更
- 部署在 Docker 或云服务器上,且多个 PHP-FPM 进程共享同一个 SQLite 文件(极易锁死)
换库不是改个 DB_CONNECTION 就完事——SQLite 的 datetime 类型在 MySQL 里得对应 timestamp,boolean 字段要重写 migration,Eloquent 模型里 $casts 也得同步调整。别低估迁移成本。











