【问题标题】:Django 1.8 migrate is not creating tablesDjango 1.8 migrate 没有创建表
【发布时间】:2016-01-10 05:54:32
【问题描述】:
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 等创建其他表。还有什么我需要在这里遵循的吗?

【问题讨论】:

  • 在做migrate之前你做makemigrations吗?
  • 是的,我做到了。使用makemigrations,它可以创建迁移文件。但是当我做migrate 时,它并没有创建表格。
  • 如果您正在升级,请确保从迁移目录中删除所有旧的南迁移文件。
  • @YSK,如果这仍然是一个问题,您可以发布您的 models.py 文件的代码吗?可能是Model Meta类中Options.managed设置为False。

标签: python django


【解决方案1】:

我在 Django 1.10 中遇到了类似的问题,但上述解决方案均不适合我。

最终起作用的是运行这个命令:

python manage.py migrate --fake myappname zero

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

后跟:

python manage.py migrate myappname

为我创建了表格。

如果您不想回滚到初始(零)状态,而是说迁移编号 0005(最后一次有效的迁移),您可以这样做:

python manage.py migrate --fake myappname 0005

然后进行实际迁移:

python manage.py migrate myappname

更多详情在docs

【讨论】:

  • 谢谢,我刚刚遇到了完全相同的问题并用你的技术解决了
  • 如果您还没有设置模型,还需要将模型设置为managed = True
  • @oat 这救了我!太感谢了!就我而言,我看不到数据库端(MS SQL)模型的变化。我删除了迁移,尝试手动更改它们,没有任何帮助......直到这个。
  • 精彩的回答,非常感谢。有谁知道为什么会这样?
  • @Alexander 好吧,我的情况是我在数据库之间切换。所以,首先我的应用程序与 sqlite 连接,然后切换到 ms sql server。这是表不会创建的地方。我想当您回滚到零迁移时,您将回到最初创建所有表的起点。所以没有混淆对齐方式。顺便说一句,它也适用于 Django 2.0.2
【解决方案2】:

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

【讨论】:

  • 你是救生员! :)
【解决方案3】:

我遇到了同样的问题。经过大量挖掘,我找到了解决方案。 我正在使用 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

【讨论】:

  • 如果有很多应用,只有一个应用有问题,drop database不是一个好方法。
  • 是的!我的情况是,我只有一个应用程序并想重新开始。
  • 我也可以删除 0001_initial.py 文件吗?
【解决方案4】:

我正在使用 MySQL 并在删除 0001_initial.py 迁移文件和所有从 DB 演变而来的自定义表以尝试重新生成所有它们后遇到此问题...

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

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

【讨论】:

    【解决方案5】:

    我有一个类似的问题,只是想通了。我有多个数据库。我的本地数据库(未更新的)是 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,现在我的迁移实际上创建了我的表。

    【讨论】:

      【解决方案6】:

      在 models.py 中更改 managed = True(如果设置为 False)

      class Meta:
          managed = False
          db_table = 'table_name'
      

      class Meta:
          managed = True
          db_table = 'table_name'
      

      【讨论】:

      • 你是我的救星。谢谢!
      【解决方案7】:

      我遇到了类似的问题。我做了上面所说的一切,但没有任何效果。然后我意识到我没有在我的应用程序的admin.py 文件中添加我的型号名称。

      除了上述所有内容外,您还必须在admin.py 文件中添加您的型号名称。你必须像这样添加它:

      admin.site.register(model name)
      

      【讨论】:

        【解决方案8】:

        这可能非常令人沮丧,但这是对我有用的方法。 首先,如果您已删除迁移文件,请继续重新创建它

        python manage.py makemigrations
        

        然后将迁移文件与 SQL 原始代码进行比较,如果合适则应用迁移

        python manage.py sqlmigrate [app_name] 0001
        python manage.py migrate
        

        或者您可以简单地从命令行或终端通过管道传输它

        python manage.py sqlmigrate [app_name] 0001 | [psql] db_name username
        
        BEGIN
        CREATE TABLE
        ALTER TABLE
        COMMIT
        

        注意:就我而言,我使用的是 postgresql。虽然引擎与其他数据库语言类似,但您可能不会得到预期的结果。

        【讨论】:

          【解决方案9】:

          这为我解决了问题(顺便说一下,我使用的是 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 在他的评论中所说的,但我仍然得到“没有要申请的迁移”。消息。但是,这解决了问题。

          【讨论】:

            【解决方案10】:
            • 删除 MySQL 数据库中模型的现有表。

            • 删除app文件夹下的migration文件夹。

            • 删除表中所有相关迁移记录
              来自 MySQL 的“django_migrations”。

            • 现在您可以获得清晰的模型和数据库。采用 python manage.py makemigrationspython manage.py migrate 创建表。

            希望能帮到你。

            【讨论】:

            • 请使用tour 并阅读how tos,了解如何做出有意义的贡献并写出好的答案。
            • “删除现有表”。可能是非常危险的建议。
            • 这对我来说是一个有用的提示,因为我正在开发一个新应用程序,但正如其他人所指出的,如果您的应用程序是根据表中的数据历史建立的,请谨慎行事跨度>
            【解决方案11】:

            试试这个,

            运行,

            python manage.py makemigrations app_name 
            

            上述命令将进行迁移,如果成功则运行第二个命令或 检查您在 Installed_app 中是否有拼写错误,并检查 AppConfig 模块

            python manage.py migrate app_name
            

            如果上述成功,这将在 db 中创建表

            【讨论】:

              【解决方案12】:

              问题::当您在 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
              

              【讨论】:

                【解决方案13】:

                为避免删除关键数据库,您还可以考虑将properties 置于Class Meta: 下方,例如此模型:

                class Blog(models.Model):
                    category = models.CharField(max_length=100)
                    title = models.CharField(max_length=100)
                    date_added = models.DateTimeField()
                    merits = models.CharField(max_length=300, blank=True)
                    demerits = models.CharField(max_length=300, blank=True)
                    class Meta:
                        managed = True
                        db_table = 'weblog'
                        verbose_name_plural = "Blog"
                
                    @property
                    def content_min(self):
                        return truncatechars(self.content, 50)
                

                然后您可以运行 makemigrationsmigrate 并创建您的表。

                【讨论】:

                  【解决方案14】:
                  1. 如果您只想为您的应用程序而不是所有应用程序执行此操作,请从数据库中的“django_migrations”表中清除您的应用程序迁移记录。
                  2. Python manage.py makemigrtions
                  3. 蟒蛇

                  【讨论】:

                    【解决方案15】:

                    检查您是否已将您创建的应用添加到您在settings.py 下安装的应用中。

                    列表应如下所示:

                    INSTALLED_APPS = [
                        'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes',
                        'django.contrib.sessions', 'django.contrib.messages','django.contrib.staticfiles',
                        'YourCreatedApp',
                    ]
                    

                    【讨论】:

                      【解决方案16】:
                      1. 删除数据库
                      2. 删除migration文件夹
                      3. 运行migrate 命令
                      4. 运行makemigrations 命令
                      5. 运行migrate 命令

                      它将完美地创建所有表

                      【讨论】:

                      • 我相信删除完整的迁移文件夹可能不是最好的主意,因为迁移需要一个空的 init.py 文件。
                      【解决方案17】:
                      1. 在 settings.py 中从 sqlite3 更改为 mysql
                      2. 确保您拥有关于数据库名称和用户名密码的正确信息
                      3. 删除现有迁移
                      4. 进行迁移
                      5. 然后迁移

                      【讨论】:

                        【解决方案18】:

                        确保每个应用的迁移文件夹都有一个__init__.py 文件。

                        【讨论】:

                          【解决方案19】:

                          我遇到了类似的问题,与 DB 的连接设置正确,因为所有 django 管理表都是在 DB 端创建的。但是,models.py 中没有出现任何模型

                          对我有用的是在控制台中运行:

                          python manage.py inspectdb > models.py
                          

                          它将所有内容都写入一个新的 models.py 文件中,然后我将其替换为我在 app 文件夹中的那个文件。然后我可以改变 托管 = 假 进入 托管 = 真

                          这里是文档的链接:https://docs.djangoproject.com/en/3.1/howto/legacy-databases/

                          【讨论】:

                            【解决方案20】:

                            如果您像我一样是初学者,请确保您的类扩展了 models.Model。然后进行迁移和迁移。

                            class Cook(models.Model):
                                email = models.Field()
                            

                            【讨论】:

                              【解决方案21】:

                              我通过这样做解决了一个类似的问题:

                              • 删除所有迁移文件和pycache,所以保留的是init.py
                              • 在模型、序列化程序、管理员、url 和视图中评论该表的所有实现
                              • python manage.py makemigrations
                              • python manage.py migrate
                              • 然后,取消注释该表在模型、序列化程序、管理员、url 和视图中的所有实现
                              • 然后,做python manage.py makemigrations
                              • 然后,做python manage.py migrate

                              【讨论】:

                                【解决方案22】:

                                以下命令对我有用

                                python manage.py makemigrations app_name

                                python manage.py migrate app_name

                                【讨论】:

                                • 这与this other answer 中的解决方案相同。 在回答已有答案的旧问题时,请确保提供新颖的解决方案或比现有答案更好的解释。
                                • 请停止发布重复的答案。谢谢。
                                • 答案是重复的,不代表任何新颖的解决方案
                                猜你喜欢
                                • 2016-05-31
                                • 2021-05-04
                                • 2015-07-10
                                • 2015-06-23
                                • 2015-08-03
                                • 2015-12-15
                                • 2013-10-19
                                • 2020-10-10
                                • 2020-06-01
                                相关资源
                                最近更新 更多