从Laravel修补程序控制台(sqlite)迁移时出错

时间:2018-01-30 18:06:01

标签: laravel

考虑

laravel new bug

然后加入.env

DB_CONNECTION=sqlite
DB_DATABASE=/home/me/Code/bug/storage/database.sqlite

创建数据库

touch /home/me/Code/bug/storage/database.sqlite

迁移

php artisan migrate && php artisan migrate:fresh

现在尝试在修补程序中以编程方式进行迁移

php artisan tinker
>> Artisan::call('migrate');

第一次导致=> 0(正如预期的那样?)但第二次:

>>> Artisan::call('migrate:fresh')
  

Illuminate \ Database \ QueryException,消息为'SQLSTATE [HY000]:   一般错误:17数据库模式已更改(SQL:select * from   sqlite_master,其中type ='table'和name = migrations)'

     
    
      

工匠::呼叫( '迁移')       第三次:

    
  
     

Symfony \ Component \ Console \ Exception \ CommandNotFoundException with   消息'“migrate”命名空间中没有定义命令。'

这里有什么想法吗?你可以重现吗?

<小时/> 使用postgres更新。第二次运行Artisan :: call('migrate:fresh')我得到:

  

Symfony \ Component \ Console \ Exception \ CommandNotFoundException with   消息'“migrate”命名空间中没有定义命令。'

更新2:此处提交的问题: https://github.com/laravel/framework/issues/22997 https://github.com/laravel/tinker/issues/37

1 个答案:

答案 0 :(得分:3)

我不认为这是一个laravel错误,但我发现了你的问题:

调用Artisan::call('migrate:fresh')之类的非现有命令会崩溃。原因是拼写错误:修补程序不接受fresh,只接受refresh。通过修补程序调用命令将清空sqllite文件,这样您就可以执行任何命令,直到您没有修补程序进行迁移。

以下是我的步骤:

php artisan migrate # sqllite file is filled with content
php artisan tinker
> Artisan:call('refresh')
> Artisan::call('fresh') # now the sqllite file is empty
> Artisan::call('migrate') # will crash
php artisan migrate
> Artisan::('refresh') # works

所以我认为它是一个修补程序的错误,而不是一个错误的错误。 Tinker正在做某种快照(如果您更改模型,则必须重新启动修补程序以在其中调用它),可能错误处理未实现是捕获所有错误的最佳方法。