【问题标题】:Error while migrating from Laravel tinker console (sqlite)从 Laravel 修补程序控制台(sqlite)迁移时出错
【发布时间】:2018-07-09 17:13:12
【问题描述】:

考虑

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

现在尝试在 tinker 中以编程方式迁移

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

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

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

Illuminate\Database\QueryException 带有消息“SQLSTATE[HY000]: 一般错误:17 数据库架构已更改(SQL:select * from sqlite_master where type = 'table' and name = migrations)'

Artisan::call('迁移') 第三次:

Symfony\Component\Console\Exception\CommandNotFoundException 与 message '“迁移”命名空间中没有定义命令。'

有什么想法吗?你能复制吗?


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

Symfony\Component\Console\Exception\CommandNotFoundException 与 message '“迁移”命名空间中没有定义命令。'


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

【问题讨论】:

  • 确认我可以重现错误。仅供参考,您的数据库路径中似乎有错字。在.env 中,它指向database,但是当您创建文件时,它却指向database 目录。假设这是一个错字,而不是您的实际步骤,因为我能够在引用正确路径时重现。
  • 谢谢!是的,这是在起草帖子时打错了字。已在编辑中修复。
  • 您是否尝试过使用 MySQL 让它工作?值得一试,看看我们是否可以将其缩小到 sqlite 驱动程序问题或更大的 Artisan 问题
  • 您是否在连接配置中设置了 'ATTR_PERSISTENT' => TRUE ?和 APP_ENV=local ?
  • APP_ENV=local - 是,ATTR_PERSISTENT - 否

标签: laravel


【解决方案1】:

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

调用像Artisan::call('migrate:fresh') 这样不存在的命令会崩溃。原因是一个错字:tinker 不接受fresh,只接受refresh。通过 tinker 调用命令将清空 sqllite 文件,因此在没有 tinker 的情况下迁移之前无法执行任何命令。

这是我的步骤:

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

所以我认为这是一个修补程序错误,而不是 laravel 错误。 Tinker 正在做某种快照(如果你更改了一个模型,你必须重新启动 tinker 才能在那里调用它),也许没有实现错误处理是捕获所有错误的最佳方法。

【讨论】:

  • 谢谢!第二段不行吗? \Artisan::call('migrate:refresh') 给出与 \Artisan::call('migrate:fresh') 完全相同的错误:“migrate”命名空间中没有定义命令。但是是的,它与修补程序相关,因为命令在 web.php 中工作(我实际上需要它们)。
  • 如果之前崩溃,刷新将不起作用。仅当您有一个非空的 sqllite 文件时。您必须使用非修补程序调用重置它,然后它应该可以工作
  • 谢谢。将问题移至正确的仓库:laravel/tinker
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2018-09-25
  • 2017-01-08
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多