Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error while migrating from Laravel tinker console (sqlite)

Tags:

laravel

Consider

laravel new bug

Then adding in .env

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

creating database

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

migrating

php artisan migrate && php artisan migrate:fresh

Now trying to migrate programmatically in tinker

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

First time resulting in => 0 (as expected ?) But second time:

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

Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 17 database schema has changed (SQL: select * from sqlite_master where type = 'table' and name = migrations)'

Artisan::call('migrate') Third time:

Symfony\Component\Console\Exception\CommandNotFoundException with message 'There are no commands defined in the "migrate" namespace.'

Any ideas whats going on here? Can you reproduce?


Update using postgres. The second time running Artisan::call('migrate:fresh') I get:

Symfony\Component\Console\Exception\CommandNotFoundException with message 'There are no commands defined in the "migrate" namespace.'


UPDATE 2: Issue filed here: https://github.com/laravel/framework/issues/22997 https://github.com/laravel/tinker/issues/37

like image 422
ajthinking Avatar asked Jan 30 '18 18:01

ajthinking


1 Answers

I don't think if this is a laravel bug, but I found your problem:

Calling a non existing command like Artisan::call('migrate:fresh') will crash. The reason is a typo: tinker does not accept fresh, only refresh. Calling the command via tinker will empty the sqllite file so you can't execute any commands until you migrate without tinker.

Here are my steps:

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

so I think it's a tinker bug, not a laravel one. Tinker is doing some kind of snapshot (If you change a Model you have to restart tinker to call it there), maybe the error handling is not implemented is the best way to catch all errors.

like image 116
cre8 Avatar answered Nov 05 '22 10:11

cre8