django 迁移 没有要申请的迁移

django migration No migrations to apply

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

1) 通过 sql

删除了所有表

2) 删除了迁移文件夹

因此,当我现在执行 manage.py makemigrations myapp 时,它正在创建迁移文件夹和 initial.py 文件,看起来不错。 __init__.py 也在那里。但是,如果我这样做 manage.py makemigrations myapp,我总是会收到消息 "No migrations to apply."

我在 shell 中查找了数据库,但没有表格。

我正在使用 Django 1.8。

Django 会跟踪 django_migrations table 中所有已应用的迁移。 因此,只需删除 django_migrations table 中与您的应用程序相关的所有行,例如:

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

然后做:

python manage.py makemigrations
python manage.py migrate

Django 跟踪 django_migrations table.

中所有已应用的迁移

所以,你可以按照这个方法:

  1. 从django_migrations中删除相关行。

  2. 运行 python manage.py 迁移。

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

用这个替换你的数据库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

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

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

如果您不喜欢table 删除这样的行,那么您可以使用 Django 的管理命令将 my-app 替换为您的应用名称。

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

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

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

在 运行在 Django 3.0 上解决这个问题后,我花了一整天的时间来解决这个问题。分享这个,这样其他人就不需要了。大多数时候运行宁

python manage.py makemigrations
python manage.py migrate

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

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

python manage.py migrate --fake-inital appname

这解决了问题。不确定是否应该这么复杂。

而不是运行:

python manage.py migrate

只是 运行:

python manage.py migrate --run-syncdb

如果您有很多问题需要解决方案

创建数据库备份(必要时创建多个)

我的解决方案是 运行 SQL shell

中的以下查询
drop database database_name with (force);

这完全删除了数据库,小心

它解决了我的错误

问候