3

当数据库文件不存在时,迁移(有点)似乎会默默地失败。迁移执行,但没有创建 db 文件,我可以再次运行迁移。(它从不说“没有什么要迁移的”)如果我创建一个空白文件,那么它就可以工作。

这很奇怪,因为我认为 SQLite 总是在找不到 db 文件时创建它,所以我不确定这是一个错误还是我做错了什么。也许这是一个权限问题?但其他一切都在工作,所以我不知道。我正在使用 Windows 7,该项目在我的

4

4 回答 4

16

用户blamh建议添加以下代码片段以app/start/artisan.php在数据库不存在时自动重新创建数据库,而不是抛出异常。

if (Config::get('database.default') === 'sqlite') {
    $path = Config::get('database.connections.sqlite.database');
    if (!file_exists($path) && is_dir(dirname($path))) {
        touch($path);
    }
}

有了这个,您可以安全地删除 SQLite 数据库,然后根据需要重新迁移和重新播种。

于 2014-02-17T23:48:32.047 回答
6

我已经针对laravel/framework发布了这个错误。

如果数据库不存在或自动创建数据库,希望未来的版本会给出错误。

于 2013-07-26T06:40:11.583 回答
0

这是来自Virtlinks 答案的更新且更灵活的解决方案

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class SqliteServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        if (DB::getDriverName() === 'sqlite') {
            $path = DB::getConfig('database');
            if (!file_exists($path) && is_dir(dirname($path))) {
                touch($path);
            }
        }
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
于 2016-06-13T09:08:32.840 回答
0

这是另一种自动创建数据库文件的方法,在 Laravel 5.4 上进行了测试。

这与 Gummibeer 的答案相同,只是我将逻辑移至App\Console\Kernel类 ( ),并且仅在运行命令app/Console/Kernel.php时才会执行检查。migrate

<?php

use Illuminate\Support\Facades\DB;

class Kernel extends ConsoleKernel
{
    /**
     * @param  \Symfony\Component\Console\Input\InputInterface  $input
     * @param  \Symfony\Component\Console\Output\OutputInterface  $output
     * @return int
     */
    public function handle($input, $output = null)
    {
        $this->touchSQLiteDatabase($input);

        return parent::handle($input, $output);
    }

    protected function touchSQLiteDatabase($input)
    {
        $this->bootstrap();

        if (substr((string)$input, 0, 7) == 'migrate' && DB::getDriverName() === 'sqlite') {
            $path = DB::getConfig('database');

            if (!file_exists($path) && is_dir(dirname($path))) {
                touch($path);
            }
        }
    }
}
于 2017-05-24T21:43:09.397 回答