Laravel表*没有名为*的列

时间:2017-02-10 17:45:16

标签: php laravel sqlite database-migration

我的单元测试最近开始失败。我收到了这个错误:

PDOException: SQLSTATE[HY000]: 
General error: 1 table loan_details has no column named start_month

它发生的地方,我有这个代码:

$loan = LoanDetails::create(['loan_percentage' => .8,
        'loan_product_id' => 1,
        'interest_rate' => .5,
        'start_month' => 0,
        'term' => 120,
        'fixed_finance_fee' => 0,
        'variable_finance_Fee' => 0,
        'valid_from' => '2015-01-01'
    ]);

如果我注释掉" start_month"然后它在逻辑上工作。

在我的单元测试设置中,我运行所有迁移(大约80)。

我的迁移看起来像这样:

Schema::table('loan_details', function(Blueprint $table){
     $table->integer('start_month')->unsigned()->after('interest_only')->default(0);
     $table->decimal('balloon_percent',4,3)->after('term')->nullable();
     $table->integer('balloon_month')->after('balloon_percent')->nullable();
     $table->dropColumn('ordinal_rank');
});

所以,我想知道所有的迁移是否都没有运行所以我运行了这段代码:

$rows = DB::table('migrations')->get();
print_r($rows);

这会将所有迁移列为已完成。我正在使用内存中的sqlite db进行测试。

我想知道迁移是否是异步运行的,而且我的代码运行时它们还没有完成?或者,如果迁移在某处静默失败?

我已经在这里工作了好几个小时,并且不知道发生了什么。

*更新我有一个在上述迁移后运行的迁移,我确认后续迁移成功。所以只有这一次迁移才会以某种方式无声地失败。

2 个答案:

答案 0 :(得分:12)

我发现了这个问题。这是因为sqlite在一次表调用中没有多个添加列语句的荒谬限制,如here所示。

当我将迁移分开时,如下所示:

Schema::table('loan_details', function(Blueprint $table){
    $table->integer('start_month')->unsigned()->after('interest_only')->default(0);
});
Schema::table('loan_details', function(Blueprint $table){
    $table->decimal('balloon_percent',4,3)->after('term')->nullable();
});
Schema::table('loan_details', function(Blueprint $table){
    $table->integer('balloon_month')->after('balloon_percent')->nullable();
});
Schema::table('loan_details', function(Blueprint $table){
    $table->dropColumn('ordinal_rank');
});

答案 1 :(得分:2)

检查SQLite数据库记录COPY

还有许多其他有用的内置点命令 - 请参阅文档 here,sqlite3的特殊命令部分。

另外,请检查数据库架构