我搞砸了我的数据库所以我试着重做它。我做了:
1)通过sql
删除所有表2)删除了迁移文件夹
所以,当我现在manage.py makemigrations myapp
时,它正在创建迁移文件夹和initial.py文件,看起来很好。 __init__.py
也在那里。但是,如果我manage.py makemigrations myapp
我总是收到消息“无需迁移。”
我在shell中查找了数据库,表格不在那里。
我正在使用Django 1.8。
答案 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表中的所有应用迁移。
所以,你可以遵循这个方法:
从django_migrations中删除相关行。
运行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
该命令将从数据库中删除迁移历史记录行,使您可以从头开始重新迁移。然后,您需要:
__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