當數據庫文件不存在時,看起來遷移(有點)會自動失敗。遷移執行但沒有創建數據庫文件,我可以再次運行遷移。 (它從來沒有說「沒有什麼可遷移」)如果我創建一個空白文件,然後它的作品。當SQLite數據庫文件不存在時,遷移失敗?
這很奇怪,因爲我認爲SQLite總是創建db文件,如果它沒有被發現,所以我不知道這是一個錯誤還是我做錯了什麼。也許這是一個權限問題?但其他一切都在工作,所以我不知道。我正在使用Windows 7並且該項目位於我的
當數據庫文件不存在時,看起來遷移(有點)會自動失敗。遷移執行但沒有創建數據庫文件,我可以再次運行遷移。 (它從來沒有說「沒有什麼可遷移」)如果我創建一個空白文件,然後它的作品。當SQLite數據庫文件不存在時,遷移失敗?
這很奇怪,因爲我認爲SQLite總是創建db文件,如果它沒有被發現,所以我不知道這是一個錯誤還是我做錯了什麼。也許這是一個權限問題?但其他一切都在工作,所以我不知道。我正在使用Windows 7並且該項目位於我的
我已發佈此錯誤,對laravel/framework。
如果數據庫不存在或希望自動創建一個,希望將來的版本會發生錯誤。
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數據庫,然後重新遷移並重新種子它,如果你願意。
這將如何工作5.1/5.2? – Sevenearths
<?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);
}
}
}
}
我剛創建了一個工匠腳本,如果它不存在,就創建一個腳本。 –
@BrianOrtiz,你會分享它嗎? :) – Nicekiwi