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.
中所有已应用的迁移
所以,你可以按照这个方法:
从django_migrations中删除相关行。
运行 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);
这完全删除了数据库,小心
它解决了我的错误
问候
我搞砸了我的数据库,所以我试图重做它。我做到了:
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.
中所有已应用的迁移所以,你可以按照这个方法:
从django_migrations中删除相关行。
运行 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);
这完全删除了数据库,小心
它解决了我的错误
问候