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

mat*_*usc 51 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")
Run Code Online (Sandbox Code Playgroud)

创建迁移返回:

  Migrations for 'profiles':
      0001_initial.py:
        - Create model RoadmapProfile
Run Code Online (Sandbox Code Playgroud)

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

Operations to perform:
  Apply all migrations: profiles
Running migrations:
  No migrations to apply.
Run Code Online (Sandbox Code Playgroud)

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

OperationalError at /accounts/update/

no such column: profiles_roadmapprofile.fullname
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Zul*_*deh 105

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

  • 是的!从django_migrations中删除对我有用 (14认同)
  • 这应该是公认的答案,以前只是一个评论...... (11认同)
  • 应该小心地完成"删除所有文件"的答案,有时我们不能/不想删除所有内容. (4认同)
  • 不适合我.谨慎行事. (3认同)
  • 我强烈建议先检查您的迁移。SELECT * FROM django_migrations; 在这里,您将获得包含所有迁移的列表。获取 id,然后运行 ​​DELETE FROM django_migrations WHERE django_migrations.id in (id2, id2 .... idN) (3认同)

pha*_*152 39

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

情况:

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

我做了什么:

在shell上运行:

python manage.py makemigrations app-name
python manage.py migrate app-name
Run Code Online (Sandbox Code Playgroud)

发生了什么:

  • 数据库中没有任何更改

  • 但是当我检查数据库模式时,它仍然是旧模式

原因:

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

我尝试了什么:

从该表(delete from django_migrations where app = "app-name")中删除app ="my-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示例: delete from django_migrations where app = "your-app-name";

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

  4. 通过运行进行新的迁移 python manage.py makemigrations your-app-name

  5. python manage.py migrate your-app-name

这适合我.我设法保留现有数据.

更多想法:

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

  • 这是迄今为止最明确的答案。解决方案 2 对我有用。 (2认同)

ACi*_*der 28

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

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

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

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

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


mas*_*ood 12

1-运行python manage.py makemigrations <appname>

2- run python manage.py sqlmigrate <appname> <migrationname>- 你会在appname下的migration文件夹中找到migrationname(当然没有'.py'扩展名)

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

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


Leo*_*mos 6

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

python manage.py makemigrations --empty yourappname

python manage.py migrate yourappname

要么:

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

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

然后做:

python manage.py makemigrations python manage.py migrate


小智 5

python manage.py migrate --fake APPNAME zero
Run Code Online (Sandbox Code Playgroud)

这将使您迁移到假货。现在您可以运行迁移脚本

python manage.py migrate APPNAME
Run Code Online (Sandbox Code Playgroud)

将创建表,您可以解决您的问题。


Wol*_*eon 5

这里的问题是某处的假迁移。基本上在您的数据库中,从您的模型创建的表不存在,尽管该表之前存在过某个时间,但由于旧更新,无论它可能是什么。问题是 django 已经进行了这些迁移,因此表必须存在,因此可以忽略迁移,但在 Admin 中出现错误“table_doesnt_exist”。

解决方案:

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

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

 SELECT * FROM django_migrations;
Run Code Online (Sandbox Code Playgroud)

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

4.- 现在让我们使用 id 从这个表中删除这一行,

 DELETE FROM django_migrations where django_migrations.id in (value_id1, value_id2 ... value_idN);
Run Code Online (Sandbox Code Playgroud)

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

5.- 将应用程序迁移到零

 manage.py migrate <app_name> zero
Run Code Online (Sandbox Code Playgroud)

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

7.- 创建迁移

 manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)

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

 manage.py migrate
Run Code Online (Sandbox Code Playgroud)

就是这样。按照这些说明操作应该不会有任何问题。顺便说一下,您不应该丢失来自其他模型的任何数据,因为您只是迁移和更新与这些特定模型相关的表。


小智 5

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

select * from django_migrations where app='your appname'  (app in which u have issue with).
Run Code Online (Sandbox Code Playgroud)

这将列出该应用程序的所有已应用的迁移。
转到您的 app/migration 文件夹并检查所有的 migrations 。找到与您的错误相关的迁移文件。创建表或添加或修改列的文件。
在 django_migrations 表中查找此迁移文件的 id( select * from django_migrations where app='your app') 。

然后做 :

delete from django_migrations where id='id of your migration';
Run Code Online (Sandbox Code Playgroud)

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

现在重新申请迁移

Python manage.py migrate yourappname
Run Code Online (Sandbox Code Playgroud)

第二个选择

  1. 删除应用程序中出现问题的表。

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

  3. 现在运行

    python manage.py makemigrations 应用程序名称

  4. 现在运行

python manage.py migrate appname