我用未签名的用户id
创建了一个迁移。如何在新迁移中编辑user\u id
,使其也可以nullable()
?
Schema::create('throttle', function(Blueprint $table)
{
$table->increments('id');
// this needs to also be nullable, how should the next migration be?
$table->integer('user_id')->unsigned();
}
我假设您正试图编辑一个已经添加了数据的列,所以删除该列并将其作为可为空的列再次添加是不可能的,因为它会丢失数据。我们将更改现有列。
但是,Laravel的模式生成器不支持修改列,只支持重命名列。因此,您需要运行原始查询来执行这些操作,如下所示:
function up()
{
DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
}
为了确保您仍然可以回滚迁移,我们还将执行
down()
。
function down()
{
DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}
需要注意的是,由于要在可为空和不可为空之间进行转换,因此需要确保在迁移之前/之后清理数据。因此,在迁移脚本中以两种方式执行此操作:
function up()
{
DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
DB::statement('UPDATE `throttle` SET `user_id` = NULL WHERE `user_id` = 0;');
}
function down()
{
DB::statement('UPDATE `throttle` SET `user_id` = 0 WHERE `user_id` IS NULL;');
DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}
请注意,这仅在Laravel 5中可能。
首先,您需要教义/dbal包:
composer require doctrine/dbal
现在,在迁移中,您可以这样做来使列为空:
public function up()
{
Schema::table('users', function (Blueprint $table) {
// change() tells the Schema builder that we are altering a table
$table->integer('user_id')->unsigned()->nullable()->change();
});
}
您可能想知道如何恢复此操作。遗憾的是,不支持此语法:
// Sadly does not work :'(
$table->integer('user_id')->unsigned()->change();
这是恢复迁移的正确语法:
$table->integer('user_id')->unsigned()->nullable(false)->change();
或者,如果愿意,可以编写原始查询:
public function down()
{
/* Make user_id un-nullable */
DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}
Laravel 5现在支持更改列;下面是官方留档的示例:
Schema::table('users', function($table)
{
$table->string('name', 50)->nullable()->change();
});
资料来源:http://laravel.com/docs/5.0/schema#changing-纵队
Laravel4不支持修改列,因此您需要使用另一种技术,例如编写原始SQL命令。例如:
// getting Laravel App Instance
$app = app();
// getting laravel main version
$laravelVer = explode('.',$app::VERSION);
switch ($laravelVer[0]) {
// Laravel 4
case('4'):
DB::statement('ALTER TABLE `pro_categories_langs` MODIFY `name` VARCHAR(100) NULL;');
break;
// Laravel 5, or Laravel 6
default:
Schema::table('pro_categories_langs', function(Blueprint $t) {
$t->string('name', 100)->nullable()->change();
});
}
问题内容: 我正在编写一个迁移,以立即在表中创建某些列。对于down函数,我当然想再次创建这些列。我浏览了架构生成器docs,但找不到实现此目的的方法。 任何帮助,将不胜感激。 问题答案: 在Laravel 5之前,还没有使用架构生成器来更改现有表列的Laravel本机方式。您需要为此使用原始查询。 但是,从Laravel 5开始,您可以使用:
我正在编写一个迁移,以使表
我有一个已经分配了默认值的表。例如,我们可以查看以下内容: 现在我想更改活动字段的默认值。我期待着做这样的事情: 但它当然告诉我专栏已经在那里了。如何简单地更新x列的默认值而不删除该列?
我正在上进行开发,并在本地环境和生产环境中进行以下迁移。 我想用以下经过调整的字段来更改迁移: 由于我正在生产中使用当前的迁移,我不希望丢失数据。 我只是尝试用我的新表定义修改迁移文件,但我得到了: 有什么建议如何在Laravel适当地改变迁移? 谢谢你的回复!
SQLAlchemy变更日志和迁移指南现在集成在主文档中。 当前迁移指南 SQLAlchemy 1.4有什么新功能? SQLAlchemy 2.0概述和状态 迁移到Alchemy 更改日志 1.4变更日志 1.3换热器 1.2换热器 1.1换热器 1换热器 0.9换热器 0.8换热器 0.7换热器 0.6换热器 0.5换热器 0.4换热器 0.3换热器 0.2换热器 0.1换热器 旧的迁移指南 S
问题内容: 我正在尝试学习一些Flask,并且正在使用Flask-Migrate 1.6.0 所以我做了一个看起来像这样的模型 然后我将其更改为完全相同的东西,除了这一行: 当我运行我的 命令,它不会检测列类型的更改。我已经阅读了它,我知道当我更改env.py并添加compare_type = True变量时,它应该将其选中。但是我这样做无济于事,该方法现在看起来像这样 好的,所以我的问题是: 更