2013-07-26 46 views
3

當數據庫文件不存在時,看起來遷移(有點)會自動失敗。遷移執行但沒有創建數據庫文件,我可以再次運行遷移。 (它從來沒有說「沒有什麼可遷移」)如果我創建一個空白文件,然後它的作品。當SQLite數據庫文件不存在時,遷移失敗?

這很奇怪,因爲我認爲SQLite總是創建db文件,如果它沒有被發現,所以我不知道這是一個錯誤還是我做錯了什麼。也許這是一個權限問題?但其他一切都在工作,所以我不知道。我正在使用Windows 7並且該項目位於我的

回答

6

我已發佈此錯誤,對laravel/framework

如果數據庫不存在或希望自動創建一個,希望將來的版本會發生錯誤。

+0

我剛創建了一個工匠腳本,如果它不存在,就創建一個腳本。 –

+0

@BrianOrtiz,你會分享它嗎? :) – Nicekiwi

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

這將如何工作5.1/5.2? – Sevenearths

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() 
    { 
     // 
    } 
} 
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); 
      } 
     } 
    } 
}