Django 1.7 - "没有适用的迁移"在makemigrations之后运行迁移时

时间:2014-09-21 11:27:06

标签: python django

我在Mezzanine中使用Django1.7。我创建了简单的配置文件(根据Mezzanine文档)存储在单独的应用程序"配置文件":

class RoadmapProfile(models.Model):
    user = models.OneToOneField("auth.User")
    fullname = models.CharField(max_length=100, verbose_name="Full name")

创建迁移返回:

  Migrations for 'profiles':
      0001_initial.py:
        - Create model RoadmapProfile

当我运行"迁移配置文件":

Operations to perform:
  Apply all migrations: profiles
Running migrations:
  No migrations to apply.

问题是,当我尝试打开与mezzanine.accounts相关的任何页面(例如更新帐户)时,它会崩溃:

OperationalError at /accounts/update/

no such column: profiles_roadmapprofile.fullname

我做错了什么?

17 个答案:

答案 0 :(得分:99)

  1. 在MySQL数据库中从表'profiles'删除行'django_migrations'
  2. 删除迁移文件夹中的所有迁移文件。
  3. 再试一次python manage.py makemigrationspython manage.py migrate命令。

答案 1 :(得分:33)

我是Django新手,我也遇到了同样的问题。这些答案对我没有用。我想分享一下如何解决问题,可能会节省很多时间。

情况:

我对模型进行了更改,我想将这些更改应用到数据库中。

我做了什么:

在shell上运行:

python manage.py makemigrations app-name
python manage.py migrate app-name

发生了什么:

  • 数据库

  • 未进行任何更改
  • 但是当我检查数据库架构时,它仍然是旧架构

原因:

  • 当我运行python manage.py migrate app-name时,Django会检查数据库中的django_migrations表,以查看哪些迁移已经应用,并将跳过这些迁移。

我尝试了什么:

使用app =" my-app-name"删除记录从该表(delete from django_migrations where app = "app-name")。清除我的迁移文件夹并运行python manage.py makemigration my-app-name,然后python manage.py migrate my-app-name。最投票的答案表明了这一点。但这也不起作用。

为什么?

因为有一个现有的表,而我正在创建的是"初始迁移"所以Django决定已经应用了初始迁移(因为它看到该表已经存在)。问题是现有表具有不同的模式。

解决方案1:

删除现有表(使用旧架构),进行初始迁移,然后再次应用。这将起作用(它对我有用),因为我们有一个"初始迁移"并且我们的数据库中没有相同名称的表。 (提示:我使用python manage.py migrate my-app-name zero快速删除数据库中的表格

问题?您可能希望将数据保留在现有表中。你不想丢弃它们并丢失所有数据。

解决方案2:

  1. 使用与现有表格相同的架构创建初始迁移,步骤如下:

    • 修改models.py以匹配数据库中的当前表

    • 删除"迁移"

    • 中的所有文件
    • 运行python manage.py makemigrations your-app-name

  2. 使用django_migrations.app = your-app-name在django_migrations中删除所有字段 如何执行此操作取决于您使用的是哪个DB MySQL示例:delete from django_migrations where app = "your-app-name";

  3. 修改models.py以匹配新架构(例如,您现在需要的架构)

  4. 运行python manage.py makemigrations your-app-name

  5. 进行新迁移
  6. 运行python manage.py migrate your-app-name

  7. 这对我有用。我设法保留现有数据。

    更多想法:

    我遇到所有这些麻烦的原因是我删除了some-app / migrations /(迁移文件)中的文件。因此,那些迁移文件和我的数据库彼此不一致。所以除非我真的知道自己在做什么,否则我会尝试不修改这些迁移文件。

答案 2 :(得分:27)

听起来你的初始迁移是伪造的,因为该表已经存在(可能是过时的架构):

https://docs.djangoproject.com/en/1.7/topics/migrations/#adding-migrations-to-apps

  

"这将为您的应用进行新的初始迁移。现在,当你   运行迁移, Django将检测到您有初始迁移和   它想要创建的表已经存在,并将标记   已经应用的迁移。"

否则你会得到一个没有这样的表错误:)

[edit]你清理了应用迁移表吗?这也是非应用迁移的常见原因。

答案 3 :(得分:12)

1- run python 15

2- run python alert("End Of the loop."); - 你会在appname下的migration文件夹中找到migrationname(当然没有'.py'扩展名)

3-复制结果的所有文本#生成
的所有sql命令 4-转到您的数据库ide并粘贴为新查询并运行它

现在所有更改都应用于您的数据库

答案 4 :(得分:6)

就我而言,我写的是这样的:

python manage.py makemigrations - 空 yourappname

python manage.py migrate yourappname

或:

Django跟踪django_migrations表中的所有应用迁移。因此,只需删除django_migrations表中与您的应用相关的所有行,如:

DELETE FROM django_migrations WHERE app=' 您-APP-名称 '

然后执行:

python manage.py makemigrations python manage.py migrate

答案 5 :(得分:4)

python manage.py migrate --fake APPNAME zero

这会使您的迁移变为假冒。现在您可以运行迁移脚本

python manage.py migrate APPNAME

将创建表格并解决您的问题。干杯!!!

答案 6 :(得分:2)

这里的问题是某个地方的虚假迁移。基本上,在数据库中,从模型创建的表不存在,由于存在旧的更新或可能存在的任何更新,因此该表之前曾存在过。问题在于django已经进行了这些迁移,因此表应该存在,因此可以忽略迁移,但是在Admin中会出现错误“ table_doesnt_exist”。

解决方案:

1。-确保保存该模型中的所有数据。

2.-访问您的数据库并运行此查询。

 SELECT * FROM django_migrations;

3.-从查询生成的列表中获取ID。这些是Django到目前为止已迁移的迁移,因此表应该存在。在您的情况下,我会查找名为 roadmapprofile 的行,因为这是您模型的名称。

4.-现在让我们使用ID

从此表中删除此行
 DELETE FROM django_migrations where django_migrations.id in (value_id1, value_id2);

用相应的ID替换value_id1和value_id2。它可能只有一个或多个,所以如果看不到超过1个id,请不要担心,这意味着当前应用程序下仅存在一个模型。

5.-将应用迁移到零

 manage.py migrate <app_name> zero

6.-删除应用程序迁移文件夹中的所有迁移文件

7.-创建迁移

 manage.py makemigrations

8.-一旦删除了这些注册表,并运行manage.py migration;由于这些模型“迁移不存在”,Django将被迫为这些模型运行迁移。

 manage.py migrate

就是这样。遵循此说明,您应该不会有任何问题。顺便说一句,您不应从其他模型中删除任何数据,因为您仅迁移和更新与那些特定模型相关的表。

答案 7 :(得分:2)

我的问题是迁移中的文件夹中没有__init__.py个文件。将__init__.py添加到包含它们的文件夹后,manage.py migrate找到并运行它们。

答案 8 :(得分:1)

这是一个非常令人困惑的话题。 django将所有应用的迁移存储在名为django_migrations的表中。 执行此sql(我使用的是postgres。因此在查询工具部分)

select * from django_migrations where app='your appname'  (app in which u have issue with).

这将列出该应用程序的所有已应用迁移。
转到您的应用程序/迁移文件夹,然后检查所有迁移。找到与您的错误关联的迁移文件。创建表或添加或修改列的文件。
在django_migrations表中查找此迁移文件的ID(从django_migrations中选择*,其中app ='your app')。

然后做:

delete from django_migrations where id='id of your migration';

如果您有多个与问题相关联的迁移文件,请删除多个ID。

现在重新应用迁移

Python manage.py migrate yourappname

第二个选项

  1. 将表格拖放到您遇到问题的应用中。

  2. 从app / migrations文件夹中删除该应用程序的所有迁移。(请勿从该文件夹中删除 init .py)。

  3. 现在运行

    python manage.py makemigrations应用程序名称

  4. 现在运行

python manage.py migrate appname

答案 9 :(得分:0)

@ phanhuy152有最好的答案。只是为了加上我的两分钱:

他的解决方案是:

  1. 删除数据库中的迁移历史记录
  2. 删除migrations文件夹
  3. 在更改前编辑模型以与DB保持一致
  4. makemigrations恢复迁移文件的初始状态
  5. 然后,根据需要更改模型
  6. makemigrations再次
  7. migrate将更新应用于表格。
  8. 但在我的情况下,我在models.py文件中有几个模型,在最后一步,Django抱怨Table xxx already exists,因为初始迁移文件打算再次创建xxx表,当我们只是不要(并且不想)放弃其他桌子。

    在这种情况下,为了保存数据,我们必须告诉Django将它们留在migrate中。我们只是这样做:(假设A类是我们改变的,B类,C类保持相同):

    models.py

    from django.db import models
    
    class A(models.Models):
        ...
    
    class B(models.Models):
        class Meta:
            managed = False   # tell Django to leave this class alone
    
        ...
    
    class C(models.Models):
        class Meta:
            managed = False   # tell Django to leave this class alone
    

    在构建初始迁移后添加这些行。

    所以,现在的过程是:

    1. ...
    2. ...
    3. ...
    4. ...
    5. managed = False添加到其他类
    6. makemigrations应用Meta更改。你会看到类似的东西:
    7. 输出:

      Migrations for 'backEnd':
        backEnd/migrations/0002_auto_20180412_1654.py
          - Change Meta options on toid
          - Change Meta options on tprocessasinc
          - Change Meta options on tservers
          - Change Meta options on tsnmpserver
      
      1. migrate将其应用于数据库
      2. 立即更改模型:添加字段,更改类型等
      3. migrate再次。
      4. 删除Meta类,让Django再次管理其他类。 makemigrations,再次migrate
      5. 现在您拥有模型的所有结构和数据,而不会丢失以前存储在数据库中的部分。

答案 10 :(得分:0)

我有同样的问题。确保已创建应用程序的迁移文件夹(YOURAPPNAME /迁移)。删除文件夹并输入命令:

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

我在models.py的每个类中插入了这些行:

class Meta:
    app_label = '<app_name>'

这解决了我的问题。

答案 11 :(得分:0)

对我而言,提供的解决方案均无效。原来,我正在使用不同的设置进行迁移(manage.py)和运行(wsgi.py)。 manage.py中定义的设置使用了本地数据库,而wsgi.py设置中使用了生产数据库。因此,生产数据库从未迁移。 使用:

django-admin migrate
事实证明,

用于迁移会更好,因为您必须指定用作here的设置。

  • 请确保在迁移时,您始终将相同数据库用作 运行时!

答案 12 :(得分:0)

在迁移过程进行中,也许您的模型未链接。 尝试将其导入文件urls.py from models import your_file

答案 13 :(得分:0)

如果您将GIT用于控制版本,并且在某些提交中添加了db.sqlite3,则GIT将保留数据库的某些引用,因此在执行“ python manage.py migration”时,该引用将反映在新的数据库。我建议执行以下命令:

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch 'db.sqlite3' HEAD

对我有用:)

答案 14 :(得分:0)

使用PostgreSQL我遇到了同样的问题 我清除了迁移文件夹和迁移缓存文件夹中的所有迁移,然后在我的PGADMIN中运行:

delete from django_migrations where app='your_app'

答案 15 :(得分:0)

解决方案的原因是您必须删除您的数据。 如果您想避免这种情况 + 您正在使用 Sqlite ,请按照以下流程操作:

  1. 下载 SQLITEStudio
  2. 打开 SqliteStudio,并将其链接到您的项目数据库
  3. 点击您要修改的表格,然后添加列(与您的模型相同)

答案 16 :(得分:0)

我所做的只是删除了 django-migrations 表的最后一行。很明显这是要删除的正确迁移,因为它的名称与我生成的迁移相同但无法应用。