考虑
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
答案 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正在做某种快照(如果您更改模型,则必须重新启动修补程序以在其中调用它),可能错误处理未实现是捕获所有错误的最佳方法。