当前位置: 首页 > 知识库问答 >
问题:

Laravel 4 - 无法在种子或迁移类中捕获数据库异常

韩楷
2023-03-14

Laravel 4 与 MySql db.由于某种原因,我无法在种子类或迁移类中捕获数据库异常(照亮\数据库\查询异常):代码永远不会进入捕获块。

例如,如果我尝试在列“name”唯一的表上插入:

try {
    $data = array('id' => 1, 'name' => 'foo');
    DB::table('table')->insert($data);
}
catch (\Exception $e) {
    $this->command->error("SQL Error: " . $e->getMessage() . "\n");
}

…我总是会遇到这样的错误:

PHP Warning: Uncaught exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
  • 我试图捕获异常,\异常,\PDO异常,\照亮\数据库\查询异常等,但我没有运气。
  • 我可以捕获其他类型的异常(例如除以零等)
  • 我可以在路由内捕获 QueryException.php,相同的代码运行良好:代码输入“捕获”,我收到消息“SQL错误:等”,但没有引发警告(正确)

有什么想法吗?感谢您的帮助。

共有2个答案

陆绍辉
2023-03-14

由于php在递归中抛出异常时超过了执行时间,我终于理解了这个问题。

显然它与XDebug有关,并且它仅发生在Mac OS X上的PHP上(我在Windows上尝试了几个PHP,但从未遇到过这个问题),并且仅在通过CLI运行迁移或种子时(例如php artisan db:种子--class=class Name)。

它与这些XDebug设置相关:

xdebug.var_display_max_depth = -1
xdebug.var_display_max_children = -1
xdebug.var_display_max_data = -1

我不知道具体原因,但这导致QueryException从未被捕获,PHP向我展示了整个异常堆栈。

如果我注释这些选项,或者将它们设置为一个更合适的值(例如10),或者禁用XDebug(这不是一个好的html" target="_blank">解决方案),那么一切都运行正常,并且在迁移/种子内部,我可以捕获QueryExceptions。

韩阳飙
2023-03-14

你必须抓住“照明\数据库\查询异常”

try {
    $data = array('id' => 1, 'name' => 'foo');
    DB::table('table')->insert($data);
}
catch (\Illuminate\Database\QueryException $e) {
    $this->command->error("SQL Error: " . $e->getMessage() . "\n");
}
 类似资料:
  • 问题内容: 我正在使用Java开发数据库迁移工具。该工具将数据库表及其数据复制到目标数据库。但是我希望它可以在不同的数据库上工作。从mysql复制并在derby等中创建。使用JDBC,我们可以收集有关表及其列的足够信息。但是我要问的是,是否可以使用sql free在Java上重新创建表。我的意思是不同的数据库具有不同的数据类型,有时它们在sql语法上也有所不同。那么JDBC或任何其他库(可以是开放

  • 在开发和维护一个数据库驱动的应用程序时, 数据库的结构会像代码一样不断演变。 例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变, Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。 如下的步骤向我们展示了

  • 简介 迁移就像是数据库的版本控制, 允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和 Laravel 的 数据库结构生成器配合使用,让你轻松地构建数据库结构。如果你曾经试过让同事手动在数据库结构中添加字段,那么数据库迁移可以让你不再需要做这样的事情。 Laravel 的 Schema 门面 对所有 Laravel 支持的数据库系统提供了创建和操作数据表的相应支持。 生成迁移 使用 Art

  • 数据库迁移可以理解为对数据库结构的版本管理,可以有效的解决团队中跨成员对数据库结构的管理。 生成迁移 通过 gen:migration 生成一个迁移文件,命令后面跟的是一个文件名参数,通常为这个迁移要打算做的事情。 php bin/hyperf.php gen:migration create_users_table 生成的迁移文件位于根目录下的 migrations 文件夹内,每个迁移文件都包

  • 在首次创建数据库,您可以使用版本0指定一个迁移运行时! 注意:任何提供的子类,如,UpdateTableMigration和应该只覆盖onPreMigrate()和调用super.onPreMigrate(),所以它的正确实例化。 基类,是一个非常简单的类来执行迁移: 此处是添加到数据库的列的一个例子: 现在,我们要添加一列到这个表。我们有两种方式: 通过Migration:

  • 本文向大家介绍在SQL Server中迁移数据的几种方法,包括了在SQL Server中迁移数据的几种方法的使用技巧和注意事项,需要的朋友参考一下 1.通过工具"DTS"的设计器进行导入或者导出 DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不 多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的移动。在SQL Serve