2013-07-26 2 views
3

Кажется, что миграция (сорт) не работает, когда файл базы данных не существует. Миграция выполняется, но файл db не создается, и я снова могу выполнить миграцию. (Он никогда не говорит «ничего мигрировать»). Если я создаю пустой файл, тогда он работает.Миграции терпят неудачу, если файл базы данных 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); 
      } 
     } 
    } 
} 
Смежные вопросы