Laravel 数据库迁移 - renameColumn 错误 - 请求了未知的数据库类型枚举
Laravel db migration - renameColumn error - Unknown database type enum requested
我正在使用 Laravel 4.2
。我的 composer.json
中加载了以下库
"doctrine/dbal": "2.4.*",
我创建了以下迁移:
class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration {
public function up()
{
Schema::table('order_header', function(Blueprint $table)
{
$table->renameColumn('delivery_notes', 'packing_notes');
});
}
}
其中 delivery_notes
列类型为 text
。
当我 运行 迁移时,出现以下错误:
[Doctrine\DBAL\DBALException] Unknown database type enum requested,
Doctrine\DBAL\Platforms\MySqlPlatform may not support it.
知道我为什么会收到此错误吗?我应该如何解决这个问题?我需要重命名 table 中的一列。是否有其他方法可以重命名该列?
Note: Renaming enum
column types is not supported.
此处:https://github.com/laravel/framework/issues/1186
您可以找到一些解决此问题的方法。既然你说这个专栏不是enum
,那么看看@upngo的评论:
"...The issue is renaming ANY column on a table that has an enum
."
我还发现这篇文章重点关注这个问题并提出了一个可能对您有帮助的选项。
您可以将自定义构造函数添加到迁移中,并向 Doctrine 解释枚举应该像字符串一样对待。
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
DB::getDoctrineSchemaManager()
->getDatabasePlatform()
->registerDoctrineTypeMapping('enum', 'string');
这适用于我 Laravel 5.1
我在 Laravel 版本 5.1.19 (LTS) 中遇到了这个问题。这对于早期版本也是实际的。
当我根据之前的评论解决问题时,我想通知你。
首先,我尝试了迁移文件中的下一个代码:
$table->renameColumn('column_name');
但是在命令 php artisan migrate
之后,我得到了下一个错误:
[Symfony\Component\Debug\Exception\FatalErrorException] Class
'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
如您所知,DBAL 已从 laravel 核心中删除,我们需要将其添加到 composer.json。(例如:"require": {"doctrine/dbal": "2.5.1"}
)。
我根据需要设置 DBAL 并再次尝试执行迁移命令但出现下一个错误:
[Doctrine\DBAL\DBALException]
Unknown database type enum requested,
Doctrine\DBAL\Platforms\MySqlPlatform may not support it.
然后我在我的迁移文件中尝试了 next raw sql:
对于 up()
:
DB::statement("ALTER TABLE `table_name` CHANGE `old_column_name` `new_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`");
对于down()
:
DB::statement("ALTER TABLE `table_name` CHANGE `new_column_name` `old_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`");
而且有效。
P.S。要重命名包含枚举字段的 table 中的其他字段,我们应该
使用与原始 sql 相同的模式,如先前评论中所写。
我在 Laravel 5.1 和 PostGres 上遇到了同样的问题。
所以基本上我使用 DB::statement
创建 ENUM 并解决问题:
DB::statement("CREATE TYPE e_users AS ENUM('data1','data2')");
然后:
DB::statement("ALTER TABLE users ADD COLUMN column e_users");
这是 Laravel 5.2.45+ 的答案(可能也适用于 5.1,尚未测试或检查,请告诉我,以便我更新此问题。)
在你的 up 方法中添加这一行:
Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
像这样:
public function up()
{
Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
Schema::table('users', function (Blueprint $table) {
$table->text('bio')->change();
});
}
虽然原作者在 Laravel 4 中遇到了问题,这可以通过将 doctrine/dbal
的版本升级到 Laravel 5 中安全地修复您的 composer.json
到 ^2.6
,因为它已在 2.6.0
版本的 this PR 中修复
确保 检查 release changelog
中的破坏兼容性的更改
目前,除了避免枚举外,没有针对此问题的合法解决方案,但有一个解决方法:
使用以下内容创建迁移:
public function up()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}
这将解决您正在寻找的 ENUM 更新。此外,您可以创建 handle down 函数来恢复以前的字段状态:
public function down()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2');");
}
我正在使用 Laravel 4.2
。我的 composer.json
"doctrine/dbal": "2.4.*",
我创建了以下迁移:
class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration {
public function up()
{
Schema::table('order_header', function(Blueprint $table)
{
$table->renameColumn('delivery_notes', 'packing_notes');
});
}
}
其中 delivery_notes
列类型为 text
。
当我 运行 迁移时,出现以下错误:
[Doctrine\DBAL\DBALException] Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.
知道我为什么会收到此错误吗?我应该如何解决这个问题?我需要重命名 table 中的一列。是否有其他方法可以重命名该列?
Note: Renaming
enum
column types is not supported.
此处:https://github.com/laravel/framework/issues/1186
您可以找到一些解决此问题的方法。既然你说这个专栏不是enum
,那么看看@upngo的评论:
"...The issue is renaming ANY column on a table that has an
enum
."
我还发现这篇文章重点关注这个问题并提出了一个可能对您有帮助的选项。
您可以将自定义构造函数添加到迁移中,并向 Doctrine 解释枚举应该像字符串一样对待。
public function __construct(\Doctrine\DBAL\Migrations\Version $version)
{
parent::__construct($version);
$this->platform->registerDoctrineTypeMapping('enum', 'string');
}
DB::getDoctrineSchemaManager()
->getDatabasePlatform()
->registerDoctrineTypeMapping('enum', 'string');
这适用于我 Laravel 5.1
我在 Laravel 版本 5.1.19 (LTS) 中遇到了这个问题。这对于早期版本也是实际的。 当我根据之前的评论解决问题时,我想通知你。
首先,我尝试了迁移文件中的下一个代码:
$table->renameColumn('column_name');
但是在命令 php artisan migrate
之后,我得到了下一个错误:
[Symfony\Component\Debug\Exception\FatalErrorException] Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
如您所知,DBAL 已从 laravel 核心中删除,我们需要将其添加到 composer.json。(例如:"require": {"doctrine/dbal": "2.5.1"}
)。
我根据需要设置 DBAL 并再次尝试执行迁移命令但出现下一个错误:
[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.
然后我在我的迁移文件中尝试了 next raw sql:
对于 up()
:
DB::statement("ALTER TABLE `table_name` CHANGE `old_column_name` `new_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`");
对于down()
:
DB::statement("ALTER TABLE `table_name` CHANGE `new_column_name` `old_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`");
而且有效。
P.S。要重命名包含枚举字段的 table 中的其他字段,我们应该 使用与原始 sql 相同的模式,如先前评论中所写。
我在 Laravel 5.1 和 PostGres 上遇到了同样的问题。
所以基本上我使用 DB::statement
创建 ENUM 并解决问题:
DB::statement("CREATE TYPE e_users AS ENUM('data1','data2')");
然后:
DB::statement("ALTER TABLE users ADD COLUMN column e_users");
这是 Laravel 5.2.45+ 的答案(可能也适用于 5.1,尚未测试或检查,请告诉我,以便我更新此问题。)
在你的 up 方法中添加这一行:
Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
像这样:
public function up()
{
Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
Schema::table('users', function (Blueprint $table) {
$table->text('bio')->change();
});
}
虽然原作者在 Laravel 4 中遇到了问题,这可以通过将 doctrine/dbal
的版本升级到 Laravel 5 中安全地修复您的 composer.json
到 ^2.6
,因为它已在 2.6.0
确保 检查 release changelog
中的破坏兼容性的更改目前,除了避免枚举外,没有针对此问题的合法解决方案,但有一个解决方法:
使用以下内容创建迁移:
public function up()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2', 'enum3+');");
}
这将解决您正在寻找的 ENUM 更新。此外,您可以创建 handle down 函数来恢复以前的字段状态:
public function down()
{
DB::statement("ALTER TABLE `table` CHANGE `example_enum_column` `example_enum_column` ENUM('enum1', 'enum2');");
}