Ron*_*ess 394 django django-migrations
我已经进行了迁移,添加了一个新表,并希望还原它并删除迁移,而不创建新的迁移.
我该怎么做?是否有恢复上次迁移的命令,然后我可以删除迁移文件?
Ala*_*air 717
您可以通过迁移到先前的迁移来恢复.
例如,如果您的最后两次迁移是:
0010_previous_migration
0011_migration_to_revert
然后你会做:
./manage.py migrate my_app 0010_previous_migration
Run Code Online (Sandbox Code Playgroud)
然后,您可以删除迁移0011_migration_to_revert
.
如果您使用的是Django 1.8+,则可以显示所有迁移的名称
./manage.py showmigrations my_app
Run Code Online (Sandbox Code Playgroud)
要撤消应用的所有迁移,您可以运行:
./manage.py migrate my_app zero
Run Code Online (Sandbox Code Playgroud)
Dan*_*ick 31
在还原之前不要删除迁移文件。我犯了这个错误,没有迁移文件,数据库不知道要删除哪些内容。
python manage.py showmigrations
python manage.py migrate {app name from show migrations} {00##_migration file.py}
Run Code Online (Sandbox Code Playgroud)
python manage.py migrate app_name_here zero
Run Code Online (Sandbox Code Playgroud)
删除迁移文件。一旦所需的迁移在您的模型中...
python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
Ala*_*nSE 30
Alasdair的答案涵盖了基础知识
./manage.py showmigrations
migrate
使用应用名称和迁移名称但应该指出的是,并非所有迁移都可以逆转.如果Django没有规则来进行逆转,就会发生这种情况.对于您自动进行迁移的大多数更改,可以进行./manage.py makemigrations
撤消.但是,自定义脚本需要同时写入正向和反向,如下例所示:
https://docs.djangoproject.com/en/1.9/ref/migration-operations/
如果你有一个RunPython
操作,那么也许你只想退出迁移而不编写逻辑上严格的反转脚本.以下对文档示例的快速入侵(上面的链接)允许这样做,使数据库处于迁移应用后的状态,即使在撤消之后也是如此.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
def forwards_func(apps, schema_editor):
# We get the model from the versioned app registry;
# if we directly import it, it'll be the wrong version
Country = apps.get_model("myapp", "Country")
db_alias = schema_editor.connection.alias
Country.objects.using(db_alias).bulk_create([
Country(name="USA", code="us"),
Country(name="France", code="fr"),
])
class Migration(migrations.Migration):
dependencies = []
operations = [
migrations.RunPython(forwards_func, lambda apps, schema_editor: None),
]
Run Code Online (Sandbox Code Playgroud)
这适用于Django 1.8,1.9
更新:写这将是更换更好的办法lambda apps, schema_editor: None
用migrations.RunPython.noop
在上面的代码片段.这些在功能上都是一样的.(信用评论)
Rad*_*deh 12
要恢复迁移:
python manage.py migrate <APP_NAME> <MIGRATION_NUMBER_PREFIX>
Run Code Online (Sandbox Code Playgroud)
MIGRATION_NUMBER_PREFIX
是您要恢复到的迁移的编号前缀,例如0001
转到0001_initial.py
迁移。然后您可以删除该迁移。
您可以将其
zero
用作迁移编号来还原应用程序的所有迁移。
Alb*_*ing 11
首先:找到您的应用程序以前的迁移,
python manage.py showmigrations
例如:
bz
[X] 0001_initial
[ ] 0002_bazifff
Run Code Online (Sandbox Code Playgroud)
如果您想要回滚0002_bazifff迁移,
python manage.py migrate bz 0001_initial
Run Code Online (Sandbox Code Playgroud)
如果你想回滚0001_initial或全部
python manage.py migrate bz zero
Run Code Online (Sandbox Code Playgroud)
好像只能回滚0001
您可以做的另一件事是删除手动创建的表.
除此之外,您还必须删除该特定的迁移文件.此外,您必须删除django-migrations表中的特定条目(可能是您的案例中的最后一个条目),该条目与该特定迁移相关.
这是我的解决方案,因为上述解决方案在您使用时并未真正涵盖用例RunPython
.
您可以通过ORM访问该表
from django.db.migrations.recorder import MigrationRecorder
>>> MigrationRecorder.Migration.objects.all()
>>> MigrationRecorder.Migration.objects.latest('id')
Out[5]: <Migration: Migration 0050_auto_20170603_1814 for model>
>>> MigrationRecorder.Migration.objects.latest('id').delete()
Out[4]: (1, {u'migrations.Migration': 1})
Run Code Online (Sandbox Code Playgroud)
因此,您可以查询表并删除与您相关的条目.这样您就可以进行详细修改.通过RynPython
迁移,您还需要处理添加/更改/删除的数据.以上示例仅显示如何通过Djang ORM访问表.
您可以通过迁移到之前的迁移来恢复。
例如使用下面的命令:
./manage.py migrate example_app one_left_to_the_last_migration
Run Code Online (Sandbox Code Playgroud)
然后删除last_migration
文件。
如果您在恢复迁移时遇到问题,并且不知何故弄乱了它,您可以执行fake
迁移。
./manage.py migrate <name> --ignore-ghost-migrations --merge --fake
Run Code Online (Sandbox Code Playgroud)
对于Django < 1.7 版本,这将在south_migrationhistory
表中创建条目,您需要删除该条目。
现在,您将能够轻松恢复迁移。
PS:我被困了很长时间,执行假迁移然后恢复帮助了我。
我在1.9.1中做了这个(删除创建的最后一个或最新的迁移):
rm <appname>/migrations/<migration #>*
例: rm myapp/migrations/0011*
登录到数据库并运行此SQL(在此示例中为postgres)
delete from django_migrations where name like '0011%';
然后我能够创建以我刚刚删除的迁移号码开始的新迁移(在本例中为11).
归档时间: |
|
查看次数: |
162600 次 |
最近记录: |