初学 laravel migrate 常见错误解决

   2016-10-01 0
核心提示:断断续续开始 laravel 入门学习,想整个简单的通讯录系统,设立了两个表,一个 branches ,一个 contacts。在创建 migration 文件的时候,没有考虑仔细,先把 contacts 表建立了,contacts 表有个外键连接到 branches 的 id,结果执行 migrate 命令的时候,出

断断续续开始 laravel 入门学习,想整个简单的通讯录系统,设立了两个表,一个 branches ,一个 contacts。

在创建 migration 文件的时候,没有考虑仔细,先把 contacts 表建立了,contacts 表有个外键连接到 branches 的 id,结果执行 migrate 命令的时候,出现以下错误:

[Illuminate\Database\QueryException]                                                                                        
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `contacts` add constraint `contac  
  ts_branch_id_foreign` foreign key (`branch_id`) references `branches` (`id`) on delete cascade) 

[PDOException]                                                          
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

初步怀疑是表创建先后不规范造成,于是,手动修改 branches 的 migration 文件名称上的日期,再执行

php artisan migrate:reset

出现如下错误:

[ErrorException]                                                                                
  include(/Users/Ade/www/laravel_phonebook5.2): failed to open stream: Operation now in progress

failed to open stream 错误解决

光看错误提示不是很理解,我们查看 laravel 的 log 文件

more storage/logs/laravel.log

找到出现 ERROR 的那段话:

[2016-09-29 18:05:35] local.ERROR: exception 'ErrorException' with message 'include(/Users/Ade/www/laravel_phonebook5.2): failed to open stream: Operation now in progress' in /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php:412
Stack trace:
#0 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(412): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'include(/Users/...', '/Users/Ade/www/...', 412, Array)
#1 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(412): Composer\Autoload\includeFile()
#2 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(301): Composer\Autoload\includeFile('/Users/Ade/www/...')
#3 [internal function]: Composer\Autoload\ClassLoader->loadClass('CreateBranchesT...')
#4 /Users/Ade/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(335): spl_autoload_call('CreateBranchesT...')
#5 /Users/Ade/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(227): Illuminate\Database\Migrations\Migrator->resolve('2016_09_12_1728...')
#6 /Users/Ade/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(206): Illuminate\Database\Migrations\Migrator->runDown(Object(stdClass), false)

错误出现在 ClassLoader.php 文件的 412 行

查看改行代码,发现是一个调用文件的语句:

初学 laravel migrate 常见错误解决

而这个文件,在 log 文件中已经指出,即 resolve('2016_09_12_1728...') 。log 提示的这个名称,就是我修改的 branch 的 migration 文件名称。

我们再搜搜正常的 migration 文件会在哪些地方出现:

mdfind 2014_10_12_000000_create_users_table.php|grep phonebook

初学 laravel migrate 常见错误解决

可见,正常的有 3 个地方出现,修改过的只有 1 个地方出现。

编辑这两个未出现的文件

调整 autoload_static.php 文件

发现 vendor/composer/autoload_static.php 文件中,和 branches 相关的语句如下:

'CreateBranchesTable' => __DIR__ .,

想来应该是改名的时候,PHP Storm自动帮我把这个文件里面有关 branches 文件路径全部给删掉了。加回去就好了。

参照正常的 migration 文件名的配置情况,补充为

'CreateBranchesTable' => __DIR__ . '/../..' . '/database/migrations/2016_09_12_172822_create_branches_table.php',

调整 autoload_classmap.php 文件

我们发现 autoload_classmap.php 文件中,有关 branches 的路径名还是修改前的路径:

'CreateBranchesTable' => $baseDir . '/database/migrations/2016_09_29_172822_create_branches_table.php',

将其修改为

'CreateBranchesTable' => $baseDir . '/database/migrations/2016_09_12_172822_create_branches_table.php',

再执行 migrate 命令

php artisan migrate:reset

初学 laravel migrate 常见错误解决

OK,刚才的错误没了,不过我们又发现 contacts 表没有回滚,

contacts 回滚失败的分析

通过 sequel pro 连上数据库查看

初学 laravel migrate 常见错误解决

发现 contacts 表果然存在,但是 migration 表中已没有内容,想必再执行前面 migrate 命令的时候出现错误,contacts 的执行记录并没有写入 migrations 表中。

我们可以重新执行 migrate 命令试试看。首先手动删除这两张表,也就是清空数据库,然后执行:

php artisan migrate

我们先忽视创建 contacts 表出现的错误,刷新 sequel pro 查看一下:

初学 laravel migrate 常见错误解决

果然,migration 表中没有 contacts 的创建记录,这也就难怪执行 reset 的时候,会没有 contacts 的回滚操作了。

contacts 无法创建 branch_id 外键的解决

现在,我们已经执行了 migrate 命令,我们重新来看看这个最早出现的错误:

[Illuminate\Database\QueryException]                                                                                                                                                      
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `contacts` add constraint `contacts_branch_id_foreign` foreign key (`branch_id`) references `br  
  anches` (`id`) on update cascade)                                                                                                                                                         
                                                                                                                                                           
                                                                          
  [PDOException]                                                          
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

冷静下来分析一下,既然提示的是 SQL 错误,我们不妨在 sequel pro 中手工执行一下这条 SQL 语句。

初学 laravel migrate 常见错误解决

果然,执行返回错误。

仔细查看语句并没有错误,一想,应该是 branch_id 类型声明和 branches 表中的 ID 类型不一致造成的吧。

查看 contacts 的结构,发现 Unsigned 没有打钩,勾选后再执行增加外键的 SQL 语句,成功。

初学 laravel migrate 常见错误解决

找到问题原因后,我们就清空数据库,修改 contacts 的 migration 文件,调整 branch_id 为:

$table->integer('branch_id')->unsigned()->comment('机构ID');

再重新执行 migrate 命令,成功!

初学 laravel migrate 常见错误解决

 
标签: 数据库 Laravel
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 【Rust】标准库-Result rust数据库
    环境Rust 1.56.1VSCode 1.61.2概念参考:https://doc.rust-lang.org/stable/rust-by-example/std/result.html示例main.rsmod checked {#[derive(Debug)]pub enum MathError {DivisionByZero,NonPositiveLogarithm,NegativeSquareRoot,}pub type MathResult =
    02-09
  • 【Rust】标准库-引用 rust 数据库框架
    环境Rust 1.56.1VSCode 1.61.2概念参考:https://doc.rust-lang.org/stable/rust-by-example/std/rc.html示例rust 使用 Rc 来实现引用计数。main.rsuse std::rc::Rc;fn main() {let rc_examples = "Rc examples".to_string();{println!("--- rc_a is created
    02-09
  • DELPHI中使用UNIDAC连接ORACLE数据库
    


		
DELPHI中使用UNIDAC连接ORACLE数据库
    DELPHI中使用UNIDAC连接ORACLE数据库
      最近在DELPHI中使用到UNIDAC连接到oracle数据库,这样可以不要安装oracle客户端,比较方便使用;所以简单学习了一下,主要是用到查询和执行存储过程,其中存储过程我测试了没有返回参数、有返回参数、有多高返回参数、有返回游标等存储过程,没有深入研究
    02-09
  • Perl操作Mysql数据库 perl操作excel
    一. 安装DBI模块步骤1:从TOOLS栏目中下载DBI.zip,下载完后用winzip解开到一个temp目录,共有三个文件:ReadmeDBI.ppdDBI.tar.gz步骤2: 在DOS窗口下,temp目录中运行下面的DOS命令:ppm install DBI.ppd 如果提示无效命令,可在perl/bin目录下运行 二. 安装DBD
    02-09
  • 在OS X系统中配置Ruby on Rails使其可以访问Sql
    经过大半天的折腾,终于可以让RoR在OS X系统里访问Sql Server数据库了。这里记录一下操作的过程,免得以后忘了。第一步,安装FreeTDS从FreeTDS的官网上下载最新的稳定版的压缩包,然后,遵照这里的说明进行手工编译(好怀念微软的Setup.exe和*.msi啊),其中
    02-09
  • 小程序-列表页跳详情页(不在数据库)
    1.缓存localstorage,可以长期保存数据2.绑定到view层id='',只要显示历史记录,就能携带id到详情页e.currentTarget.id访问点击当前的view的id
    02-09
  • Mysql数据库一个小程序实现自动创建分表。
    每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误。为了解决这个问题,研究了一下mysql的 information_schema 表:information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访
    02-09
  • C#连接本地Access数据库及简单操作的winform小程序
    C#连接本地Access数据库及简单操作的winform小
    连接本地Access数据库及简单操作的winform小程序一、准备工作用Access创建一个数据库并创建一个表格。(对于非远程数据库,Access十分简单。表格可参考三、界面设计)。二、代码using System;using System.Collections.Generic;using System.ComponentModel;u
    02-09
  • 解决小程序云函数操作数据库回调不执行
    背景最近写个微信小程序,在云函数中操作数据库时,明明操作成功了,理应回调success,却没有;而在小程序端,一样的代码,却能成功回调。 问题原因参见官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/init.html
    02-09
  • Rust 连接 SQLite 数据库
    Rust 连接 SQLite 数据库
    使用 Rust 语言连接操作 SQLite 数据库,我使用 rusqlite 这个 crate。看例子:首先,使用 cargo 创建一个 Rust 项目,然后添加依赖 rusqlite: 来到 main.rs,其余所有的代码都写在这里。首先引入 rusqlite 相关的类型,并建立一个 Person struct:Person
    02-09
点击排行