【问题标题】:Can I start my Laravel server using memory database?我可以使用内存数据库启动我的 Laravel 服务器吗?
【发布时间】:2022-04-02 20:23:50
【问题描述】:

我可以使用内存来迁移我的数据库并启动服务器吗?

我的/config/database.php

'sqlite' => array(
    'driver' => 'sqlite',
    'database' => ':memory:', // fail
    // 'database' => 'database', // success 
    'prefix' => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
),

然后迁移表并启动 laravel 服务

$ php artisan migrate:refresh 
$ php artisan serve

我使用 driver=sqlite + database=database 一切正常,

我使用driver=sqlite + database=:memory,错误信息来自127:0.0.1 说数据库表还没有创建。

【问题讨论】:

  • 您为什么要这样做?顾名思义,这些数据库存在于内存中。迁移过程完成后,内存数据库将被销毁。
  • 因为我有API服务器和WWW服务器,我想用内存数据库启动我的API服务器,然后我可以从www到API服务器进行浏览器测试(HTTP请求)。这样我就可以 Ctrl+C 停止 API 服务器而不在 API 数据库中保存任何东西。
  • 只需使用 SQlite 数据库。启动服务器时迁移,停止服务器后删除。

标签: laravel sqlite laravel-artisan


【解决方案1】:

我认为这是不可能的,因为 migrate 命令会打开一个数据库连接,然后 serve 会有一个或多个新连接。

一旦数据库连接断开,数据库就不再存在 关闭。每个 :memory: 数据库都彼此不同。所以, 打开两个数据库连接,每个连接的文件名为“:memory:” 将创建两个独立的内存数据库。

https://www.sqlite.org/inmemorydb.html

【讨论】:

  • 我想知道为什么单元测试可以使用 driver=sqlite + database=:memory ,但我的 web 服务器不能使用
  • 你的单元测试都在同一个进程上运行,使用同一个数据库连接
  • 这样php artisan serve就无法接收上一条命令创建的内存数据库了?
  • 根据链接,如果单独的连接在同一个进程中,它们只能共享一个内存数据库。由于migrate 是一个进程,serve 是另一个进程,所以我认为这行不通
【解决方案2】:

对于想要快速调试的任何人,您可以将 sqlite 数据库文件设置为/tmp 目录。例如:

DB_CONNECTION=sqlite
DB_DATABASE=/tmp/example-database.sqlite

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多