django migration无需迁移

时间:2015-11-05 16:26:11

标签: django migration

我搞砸了我的数据库所以我试着重做它。我做了:

1)通过sql

删除所有表

2)删除了迁移文件夹

所以,当我现在manage.py makemigrations myapp时,它正在创建迁移文件夹和initial.py文件,看起来很好。 __init__.py也在那里。但是,如果我manage.py makemigrations myapp我总是收到消息“无需迁移。”

我在shell中查找了数据库,表格不在那里。

我正在使用Django 1.8。

6 个答案:

答案 0 :(得分:21)

Django跟踪django_migrations表中所有应用的迁移。 因此,只需删除django_migrations表中与您的应用相关的所有行,如:

DELETE FROM django_migrations WHERE app='your-app-name';

然后执行:

python manage.py makemigrations
python manage.py migrate

答案 1 :(得分:1)

我通常自己遇到这个问题。这是我找到的解决方法:

为此替换数据库sqlite3

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': '<your_username>$<your_database_name>',
    'USER': '<your_username>',
    'PASSWORD': '<your_mysql_password>',
    'HOST': '<your_mysql_hostname>',
}

}`

可以在Pythonanywhere仪表板上的“数据库”选项卡中找到。

将其从终端推送到github,然后再次将其从Pythonanywhere Bash下拉。您可能必须在Bash控制台上添加它:pip install mysqlclient

答案 2 :(得分:0)

Django会跟踪django_migrations表中的所有应用迁移。

所以,你可以遵循这个方法:

  1. 从django_migrations中删除相关行。

  2. 运行python manage.py migrate。

答案 3 :(得分:0)

正如@Anush所述,Django确实会跟踪django_migrations表中的所有迁移。如前所述,您可以使用原始SQL删除迁移行,以为相关应用重置Django的迁移历史记录。

DELETE FROM django_migrations WHERE app='my-app';

如果您不愿意删除这样的行,则可以使用Django的管理命令将my-app替换为应用程序的名称。

python manage.py migrate --fake my-app zero

该命令将从数据库中删除迁移历史记录行,使您可以从头开始重新迁移。然后,您需要:

  • 删除应用程序“ migrations”目录中的所有迁移文件,但确保保留__init__.py文件。
  • 确保根据需要设置应用程序的数据模型
  • 使用命令python manage.py makemigrations contacts重新进行迁移。这将在您应用的迁移目录中创建0001_initial.py文件。
  • 由于数据库表已存在,因此您将无法实际迁移初始数据库迁移,因此您将需要使用命令python manage.py migrate my_app --fake-initial
  • 伪造迁移。

答案 4 :(得分:0)

在Django 3.0上遇到此问题后,我花了一整天时间对此进行了故障排除。分享这个,这样别人就不需要了。大多数时候都在运行

python manage.py makemigrations
python manage.py migrate

应该解决问题。在删除了Migrations文件夹中的文件( init .py除外)后,我执行了上述步骤,但是我无法解决问题。我发现,每次运行makemigrations时,都会在migrations文件夹中创建一个名为000x_xxx.py的python文件。我查看了文件内部,发现所有需要的更改都在那里,但是它还有我不需要的其他创建表操作(即那些表已经创建)。如果您使用--fake或--fake-initial运行迁移,则整个执行将被伪造(即在未对数据库进行任何实际更改的情况下执行)。

为解决该问题,我打开了生成的0000x_xxx.py文件,并删除了我想在数据库中进行的更改,然后再次运行“ python manage.py makemigrations”。这创建了一个具有所需更改的新迁移文件。之后,我运行了以下命令。

python manage.py migrate --fake-inital appname

这解决了问题。不知道这是否应该这么复杂。

答案 5 :(得分:0)

而不是运行:

python manage.py migrate

只需运行:

python manage.py migrate --run-syncdb