Laravel 9配置SQLite内存数据库:迁移成功但数据填充失败求助
问题解决:Laravel 9中SQLite内存数据库迁移成功但填充失败
问题核心
使用:memory:作为SQLite数据库路径时,Laravel每次建立新连接都会创建独立的内存数据库,导致迁移和填充操作不在同一个库中执行,触发SQLSTATE[HY000]: General error: 1 no such table错误。原第三方适配包crhg/laravel-sqlite-named-memory-connection仅支持到Laravel7,无法在Laravel9环境安装。
解决方案
方案1:使用SQLite原生共享内存连接(推荐)
利用SQLite原生的file::memory:?cache=sharedURI格式,实现同一进程内共享内存数据库连接,无需依赖第三方包。
- 修改
.env配置:DB_CONNECTION_DATA=sqlite DB_DATABASE_DATA=file::memory:?cache=shared - 确保
config/database.php中的SQLite配置正确读取该变量:
说明:该URI会让SQLite在当前进程内复用同一个内存数据库实例,迁移和填充操作将在同一个库中执行,彻底避免表不存在的问题。'sqlite' => [ 'driver' => 'sqlite', 'url' => env('DATABASE_URL'), 'database' => env('DB_DATABASE_DATA'), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ],
方案2:自定义共享连接解析器
通过Laravel的数据库连接解析器,手动复用:memory:连接实例。
- 创建服务提供者
app/Providers/SQLiteSharedConnectionProvider.php:<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Database\Connection; use Illuminate\Database\SQLiteConnection; class SQLiteSharedConnectionProvider extends ServiceProvider { public function boot() { Connection::resolverFor('sqlite', function ($connection, $database, $prefix, $config) { // 仅对内存数据库复用连接 if ($database === ':memory:') { static $sharedConnection = null; if (is_null($sharedConnection)) { $pdo = new \PDO("sqlite::$database"); $sharedConnection = new SQLiteConnection($pdo, $database, $prefix, $config); } return $sharedConnection; } // 常规SQLite连接逻辑 $pdo = new \PDO("sqlite:$database"); return new SQLiteConnection($pdo, $database, $prefix, $config); }); } } - 在
config/app.php的providers数组中注册该服务提供者:'providers' => [ // ... 其他服务提供者 App\Providers\SQLiteSharedConnectionProvider::class, ],
生产环境注意事项
- 内存SQLite数据库的所有数据仅存在于进程内存中,进程重启后数据会完全丢失,需确认业务场景允许该特性。
- 若采用多进程部署(如PHP-FPM),
file::memory:?cache=shared仅能在单个进程内共享数据库,不同进程会拥有独立的内存库,这种场景下内存SQLite可能不适用,建议改用磁盘SQLite或其他持久化数据库。
内容的提问来源于stack exchange,提问作者Arne
相关产品推荐
相关产品推荐

