Django 1.8 migrate不会创建表

问题描述 投票:19回答:9
yekabathula-macbookair2:roster yekabathula$ python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, api, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying api.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying sessions.0001_initial... OK
yekabathula-macbookair2:roster yekabathula$ python manage.py syncdb
/Library/Python/2.7/site-packages/django/core/management/commands/syncdb.py:24: RemovedInDjango19Warning: The syncdb command will be removed in Django 1.9
  warnings.warn("The syncdb command will be removed in Django 1.9", RemovedInDjango19Warning)

Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, api, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  No migrations to apply.

执行python manage.py migrate之后,我的models.py不会在数据库中创建表,它可以从django_session等创建其他表。还有什么我需要遵循的吗?

python django
9个回答
80
投票

我在Django 1.10中遇到了类似的问题,上述解决方案都没有为我工作。

最终运行的是运行此命令:

python manage.py migrate --fake myappname zero

这会重置所有迁移(到第0个状态)

接下来是:

python manage.py migrate myappname

为我创建了表格。

如果您不想回滚到初始(零)状态但是要说迁移号码0005(上次迁移有效),您可以改为:

python manage.py migrate --fake myappname 0005

然后继续进行实际迁移:

python manage.py migrate myappname

更多细节在docs


14
投票

在我的情况下,APP / migrations /文件夹中缺少__init__.py文件。如果你没有,它只需要一个空的__init__.py文件。


5
投票

我遇到了同样的问题。经过大量的挖掘,我找到了解决方案。我正在使用django 1.11,

如果你想重新开始,

1)delete all the files in your migrations folder except __init__.py
2)drop database
3)create database
4)python makemigrations
5)python migrate

如果你有reset_db,而不是第二和第三步,你可以使用reset_db。

python manage.py reset_db


3
投票

我有一个类似的问题,只是想出来。我有多个数据库。我的本地(未更新的)是MySQL数据库。其他是MS SQL Server和MySQL。我有其他数据库的路由器,因为我不管理它们并且(在Django 1.6中)使用路由器来指示allow_sync()= False。使用1.7,我将其更改为allow_migrate()= False。但我没有为我的本地数据库添加路由器。默认情况下似乎是allow_migrate()= False(如果没有)。结果,迁移失败了(参考:https://docs.djangoproject.com/en/1.7/topics/db/multi-db/)。我为我的本地数据库添加了一个路由器,设置allow_migrate()以返回True,现在我的迁移实际上创建了我的表。


1
投票

这解决了我的问题(我顺便使用MySQL工作台):

  • 运行这个sql:SET FOREIGN_KEY_CHECKS = 0;
  • 选择django数据库中的所有表(单击第一个表,然后按住shift,然后单击最后一个表)。然后右键单击并选择“Drop n tables”(其中n是您刚刚选择的表的数量)
  • 然后运行python manage.py migrate
  • 最后通过运行此sql:SET FOREIGN_KEY_CHECKS = 1;来恢复外键检查设置

注意:在采取这一极端措施之前,我尝试了Paulo Pessoa在评论中所说的内容,但我仍然得到了“没有适用的迁移”。消息。但是,这解决了这个问题。


1
投票
  • 删除模型的现有表。
  • 删除app文件夹下的迁移文件夹。
  • 删除表中的所有相关迁移记录 “django_migrations”。
  • 现在您可以获得清晰的模型和数据库使用makemigrations并迁移以创建表。

希望能帮到你。


1
投票

问题::当您第一次在django中应用迁移时,django会在数据库中创建该模型的表,并在其自己的文件(类)中标记某个位置:

`initial = True` 
  • 然后,当您尝试更改该表的架构时,它首先检查initial = True
  • 如果未找到初始类属性,则迁移将被视为“初始”
  • 如果我们需要使用initial = True python manage.py migrate --fake-initial

对于初始迁移,Django检查数据库中是否已存在所有这些表,如果是,则应用虚假应用迁移。同样,对于添加一个或多个字段的初始迁移,Django会检查数据库中是否已存在所有相应的列,如果是,则应用虚假应用迁移。

假初始迁移使用CreateModel()和AddField()方法。


解:

>> python manage.py makemigrations <AppName>
>> python manage.py migrate --fake-initial

0
投票
  1. 删除数据库
  2. 删除migration文件夹
  3. 运行migrate命令
  4. 运行makemigrations命令
  5. 运行migrate命令

它将完美地创建所有表


0
投票

我正在使用MySQL并在删除0001_initial.py迁移文件后进入此问题,所有自定义表从DB演变为尝试重新生成它们...

解决了这个问题,只需删除django_migrations表中的这些行...

enter image description here

之后,$ python manage.py migrate命令再次重新生成所有自定义表。

© www.soinside.com 2019 - 2024. All rights reserved.