当数据库文件不存在时,似乎迁移(某种类型)无声地失败。迁移执行但没有创建db文件,我可以再次运行迁移。 (它永远不会说“无需迁移”)如果我创建一个空白文件,那么它可以工作。
这很奇怪,因为我认为SQLite总是创建db文件,如果找不到,所以我不确定这是一个bug还是我做错了。也许这是一个权限问题?但其他一切都在运作,所以我不知道。我正在使用Windows 7,项目在我的
答案 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);
}
}
}
}