【发布时间】:2020-11-22 08:42:26
【问题描述】:
假设我有一个在生产环境中运行的代码,因此,我无法更改相同的迁移文件以添加新列,如下所示
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name')->nullable();
$table->string('email')->unique();
$table->string('token_key')->unique()->nullable();
$table->enum('type', ['avatar', 'image', 'video'])->comment(implode(', ', ['avatar', 'image', 'video']));
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
在第一个版本之后,我想从名为 type 可接受值的列中删除 avatar 值,所以我添加了一个新的迁移文件来添加我的新列,如下所示
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class ChangeEnumOnUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$sql = sprintf(
"ALTER TABLE %s CHANGE `%s` `%s` ENUM('%s') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '%s'",
'users',
'type',
'type',
implode('\',\'', ['image', 'video']),
implode(',', ['image', 'video'])
);
DB::statement($sql);
}
}
并使用vendor/bin/phpunit 我运行我的测试
请注意,首先数据库将被迁移,并且由于该测试方法没有启动
SQLite 抛出如下错误。
SQLite 异常是这样的
PDOException: SQLSTATE[HY000]: General error: 1 near "CHANGE": syntax error
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 near "CHANGE": syntax error (SQL: ALTER TABLE users CHANGE `type` `type` ENUM('image','video') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'image,video')
【问题讨论】:
-
您好,欢迎来到 SO。如果没有详细信息,这将是一个很难解决的问题。添加第二次迁移的内容将是一个很好的输入。你有什么尝试让它发挥作用。
标签: php laravel sqlite testing phpunit