SQLite数据库文件不存在时迁移失败?

时间:2013-07-26 02:53:24

标签: sqlite laravel laravel-4

当数据库文件不存在时,似乎迁移(某种类型)无声地失败。迁移执行但没有创建db文件,我可以再次运行迁移。 (它永远不会说“无需迁移”)如果我创建一个空白文件,那么它可以工作。

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

4 个答案:

答案 0 :(得分:16)

User blamh suggested将以下代码段添加到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数据库,然后根据需要重新迁移并重新播种。

答案 1 :(得分:6)

我已针对laravel/framework发出此错误。

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

答案 2 :(得分:0)

这是来自Virtlinks answer

的更新且更灵活的解决方案
<?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()
    {
        //
    }
}

答案 3 :(得分:0)

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

除了我将逻辑移到App\Console\Kernel类(app/Console/Kernel.php)之外,这与Gummibeer的答案相同,只有在运行migrate命令时才会执行检查。< / p>

<?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);
            }
        }
    }
}