【问题标题】:Django migrate : doesn't create tablesDjango migrate:不创建表
【发布时间】:2016-05-31 08:39:46
【问题描述】:

在一些错误之后,我删除了我的数据库,删除了所有迁移文件(我离开了 init.py)。 现在,当我跑步时

python migrate.py makemigrations   // It creates migrations correctly
python migrate.py migrate          // It outputs "app.0001_initial OK"

但绝对NO table(与我的应用相关)是创建的。只有那些与 django 相关的。 并且在迁移表中,我的应用程序迁移被标记为已完成但没有创建表,就像我说的那样,非常不愉快。

这是我的迁移文件的摘录:

# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-02-18 21:59
from __future__ import unicode_literals

import colorful.fields
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Client',
            fields=[
                ('id', models.AutoField(db_column='idtblclients', primary_key=True, serialize=False)),
                ('genre1', models.CharField(blank=True, max_length=10)),
            ('prenom1', models.CharField(blank=True, max_length=45)),
            ('nom1', models.CharField(blank=True, max_length=45)),
            ('genre2', models.CharField(blank=True, max_length=10)),
            ('prenom2', models.CharField(blank=True, max_length=45)),
            ('nom2', models.CharField(blank=True, max_length=45)),
            ('courriel', models.CharField(blank=True, max_length=45)),
            ('langue', models.CharField(blank=True, max_length=1)),
            ('numtel1', models.CharField(blank=True, db_column='NumTel1', max_length=20)),
            ('numtel2', models.CharField(blank=True, db_column='NumTel2', max_length=20)),
            ('numcivique', models.CharField(blank=True, db_column='NumCivique', max_length=15)),
            ('rue', models.CharField(blank=True, db_column='Rue', max_length=45)),
            ('ville', models.CharField(blank=True, db_column='Ville', max_length=45)),
            ('codepostal', models.CharField(blank=True, db_column='CodePostal', max_length=45)),
            ('timestamp', models.DateTimeField(blank=True, db_column='Timestamp', null=True)),
            ('zone', models.CharField(blank=True, db_column='Zone', max_length=45)),
        ],
        options={
            'db_table': 'tblclients',
            'managed': False,
        },
    ),
....

你知道如何解决它吗?

【问题讨论】:

  • 你在settings.py添加了应用吗?
  • 是的,当然。当我运行 migrate 时,django 告诉我“app.0001_initial OK”这应该意味着迁移已经完成(虽然他们还没有像我说的那样完成)
  • 我忘了告诉迁移忽略了我的应用迁移文件(我复制的那个)中的所有迁移,但最后一个是一个表,它与第一个其他表具有外键。所以mysql输出错误。
  • 试试python manage.py makemigrations <appname_thats_missing_tables>python manage.py migrate <appname_thats_missing_tables>
  • 啊,你是对的。我怎么没看到!谢谢。

标签: python mysql django migration


【解决方案1】:

来自 Django 文档,Options.managed:“如果为 False,则不会为此模型执行任何数据库表创建或删除操作。”

我看到你有

   options={
        'db_table': 'tblclients',
        'managed': False,
    },

尝试在模型中设置managed=True

【讨论】:

    【解决方案2】:
    python manage.py migrate --fake APPNAME zero
    

    这将使您的迁移变得虚假。 现在你可以运行迁移脚本了

    python manage.py migrate APPNAME
    

    将创建表 你解决了你的问题..干杯!!!

    【讨论】:

    • 绝对适用于 Django 2.1.5,即使您有意或错误地删除了迁移文件夹
    • python manage.py makemigrations 后跟 python manage.py migrate 是适合我的步骤
    • 这对我有用。如果数据库中已经存在某个表,请先删除所有表并运行第二个 cmd。
    • 这很棒。如果您需要重置数据库,这非常有用。
    • 哇,刚刚发生了什么?它以某种方式奏效了!以上几行是做什么的?它是如何工作的?有人吗?
    【解决方案3】:

    我面临同样的问题:

    python manage.py migrate poll
    Operations to perform:
      Apply all migrations: poll
    Running migrations:
      No migrations to apply.
    

    按照这些步骤为您的应用创建表格。

    转到您的应用文件夹

    1.删除迁移文件夹。

    2.python manage.py makemigrations.

    3 将 0001_initial.py 文件重命名为 0001_initial_manual.py。

    4 python manage.py 迁移APPNAME。

    在此之后,我的表格创建顺利。

    python manage.py migrate poll
    Operations to perform:
      Apply all migrations: poll
    Running migrations:
      Applying poll.0002_initial... OK
    

    【讨论】:

    • 在第 4 步之前,我需要删除所有创建的表 <app_name>_<model_name> 和 Django 生成的约束。
    【解决方案4】:

    在我的例子中,创建表格的是:

    python manage.py migrate --run-syncdb
    

    我正在使用 Django 1.9.6。

    【讨论】:

    • 这解决了我删除数据库并删除所有迁移后的问题
    • 谢谢,这正是我所需要的,后面是假的首字母
    • 我删除了所有的迁移——全部。然后这起作用了,即创建了表。但它没有产生迁移。这怎么可能?
    【解决方案5】:

    这就是我得到@JulienD 的答案的方式:

    1. 我在 models.py 中将元数据添加到我的模型定义中:

    class thing(models.Model): name = models.CharField(max_length=200) class Meta: app_label = 'things' managed = True

    1. 执行:

    python manage.py makemigrations

    1. 执行:

    python manage.py migrate

    在那之后python manage.py showmigrations 显示迁移并且管理站点开始工作。

    【讨论】:

      【解决方案6】:

      请检查您的项目中是否使用了多个数据库。如果配置了多个数据库,请检查默认数据库是您要查找的数据库。

      如果默认数据库和您预期的数据库不同,请运行以下指向您的数据库配置的命令。

      python manage.py migrate $app_name --database $dbname_from_setting

      希望这会有所帮助。

      【讨论】:

        【解决方案7】:

        此问题的答案取决于您的应用文件夹中是否已有迁移历史记录。就我而言,我没有……我想我删除了原始迁移脚本。

        所以按照 Django 文档,我做了以下事情:

        1. 注释掉 models.py 中的新更新
        2. 关注Adding migrations to apps...
        3. 为已存在的内容创建迁移:

          python manage.py makemigrations yourapp

        4. 假应用这些迁移(在表已经存在且不尝试重新创建的单曲之下):

          python manage.py migrate --fake-initial

        5. 取消注释 model.py 中的更改
        6. 按照Workflow部分中的步骤...

          python manage.py makemigrations yourapp

          python manage.py 迁移

        【讨论】:

          【解决方案8】:

          删除文件夹迁移并重新运行。它对我有用

          【讨论】:

          • 你不应该删除迁移文件夹,但你可以删除它的内容,但保留 init.py 非常重要。
          【解决方案9】:

          先试试这个;

          检查应用程序的迁移文件,如果迁移文件中有 create model 部分,请将其删除并重做迁移。即删除它; 迁移.CreateModel( 名称='你的模型名称', ………… .....)

          (venv)root@debian:~/Desktop/project$ python manage.py makemigrations appName
          (venv)root@debian:~/Desktop/project$ python manage.py migrate appName
          

          否则;导航到您的数据库并删除该应用程序的所有迁移, 您可能也必须删除相关表。

          postgres=# \c db_yourdb
          db_yourdb=# delete from django_migrations where app='appName';
          

          然后转到您的代码,然后;

          (venv)root@debian:~/Desktop/project$ python manage.py makemigrations appName
          (venv)root@debian:~/Desktop/project$ python manage.py migrate appName
          

          要完全进行新迁移,首先对迁移进行必要的删除,然后在需要时删除表;

          (venv)root@debian:~/Desktop/project$ find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
          (venv)root@debian:~/Desktop/project$ find . -path "*/migrations/*.pyc"  -delete
          

          终于做到了;

          (venv)root@debian:~/Desktop/project$ python manage.py makemigrations
          (venv)root@debian:~/Desktop/project$ python manage.py migrate
          

          Read more here on how to reset migrations

          【讨论】:

            【解决方案10】:

            我手动删除了其中一个表,对我有用的技巧是执行以下步骤:

            1. 删除了迁移文件夹。
            2. 从 db 中删除了迁移: DELETE from django_migrations WHERE app='alerts_db';
            3. python manage.py migrate --run-syncdb' 之前
            4. python manage.py makemigrations 'app_name'
            5. python manage.py migrate --fake

            注意:之前我没有执行 #3 步骤,也没有创建表。 我的 django 版本:v3.0.5

            【讨论】:

            • 现在是 2021 年和 django3,这个 DELETE from django_migrations WHERE app='alerts_db';命令帮助了我。
            • 太棒了!这是解决问题的正确方法!谢谢。
            【解决方案11】:

            我也遇到了这个问题,我所要做的就是解决它(我使用的是 phpymyadmin):

            1.进入 phpmyadmin 面板

            选择我连接的数据库,并清空名为 django_migrations 的表

            然后,我照常进行:python manage.py makemigrations app_name

            最后:python manage.py migrate app_name

            瞧,完成并准备好了;)

            【讨论】:

              【解决方案12】:

              这在 Django v.3 中有效:

              1. 从数据库中删除与您的应用程序相关的行:

                DELETE FROM django_migrations WHERE app='<app_name>';
                
              2. 删除您应用的迁移文件夹

              3. 终于

                ./manage.py makemigrations <app_name>
                
                ./manage.py migrate <app_name>
                
              4. 完成。表已创建。

              【讨论】:

                【解决方案13】:

                settings.py 中添加您的应用名称,如下所示: https://docs.djangoproject.com/en/3.2/ref/applications/

                【讨论】:

                  【解决方案14】:

                  我最近遇到了这个问题,我发现问题是我的应用程序(也已添加到设置中)以大写字母开头。 有趣的是,从未抛出任何错误来警告这一点,但我一直看到与应用程序相关的某些表不存在的错误。

                  所以,请确保您的应用名称以小写字母开头,以及python manage.py makemigrations &lt;appName&gt;python manage.py migrate

                  【讨论】:

                    【解决方案15】:

                    我也有类似的问题。

                    py manage.py 迁移 要执行的操作: 应用所有迁移:admin、auth、contenttypes、sessions、token_blacklist 运行迁移: 没有要应用的迁移。

                    最后检查了很多解决方案后,我发现我在很多项目中都使用了相同的环境。我正在运行另一个项目的 manage.py。情况可能和我一样。如果情况与我的情况不相似,那么上述所有解决方案都有效。

                    【讨论】:

                      猜你喜欢
                      • 2016-01-10
                      • 2013-10-19
                      • 2020-06-01
                      • 2015-12-15
                      • 2021-11-01
                      • 2020-07-02
                      • 2014-02-16
                      • 2021-06-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多