You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式,实现同一进程内共享内存数据库连接,无需依赖第三方包。

  1. 修改.env配置:
    DB_CONNECTION_DATA=sqlite
    DB_DATABASE_DATA=file::memory:?cache=shared
    
  2. 确保config/database.php中的SQLite配置正确读取该变量:
    'sqlite' => [
        'driver' => 'sqlite',
        'url' => env('DATABASE_URL'),
        'database' => env('DB_DATABASE_DATA'),
        'prefix' => '',
        'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
    ],
    
    说明:该URI会让SQLite在当前进程内复用同一个内存数据库实例,迁移和填充操作将在同一个库中执行,彻底避免表不存在的问题。

方案2:自定义共享连接解析器

通过Laravel的数据库连接解析器,手动复用:memory:连接实例。

  1. 创建服务提供者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);
            });
        }
    }
    
  2. 在config/app.php的providers数组中注册该服务提供者:
    'providers' => [
        // ... 其他服务提供者
        App\Providers\SQLiteSharedConnectionProvider::class,
    ],
    

生产环境注意事项

  • 内存SQLite数据库的所有数据仅存在于进程内存中,进程重启后数据会完全丢失,需确认业务场景允许该特性。
  • 若采用多进程部署(如PHP-FPM),file::memory:?cache=shared仅能在单个进程内共享数据库,不同进程会拥有独立的内存库,这种场景下内存SQLite可能不适用,建议改用磁盘SQLite或其他持久化数据库。

内容的提问来源于stack exchange,提问作者Arne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:45:19