当数据库文件不存在时,迁移(有点)似乎会默默地失败。迁移执行,但没有创建 db 文件,我可以再次运行迁移。(它从不说“没有什么要迁移的”)如果我创建一个空白文件,那么它就可以工作。
这很奇怪,因为我认为 SQLite 总是在找不到 db 文件时创建它,所以我不确定这是一个错误还是我做错了什么。也许这是一个权限问题?但其他一切都在工作,所以我不知道。我正在使用 Windows 7,该项目在我的
用户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 数据库,然后根据需要重新迁移和重新播种。
我已经针对laravel/framework发布了这个错误。
如果数据库不存在或自动创建数据库,希望未来的版本会给出错误。
这是来自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()
{
//
}
}
这是另一种自动创建数据库文件的方法,在 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);
}
}
}
}