Django 1.7 – 在迁移之后迁移时迁移的“没有迁移应用”

我使用Django1.7和Mezzanine。 我创build简单的configuration文件(根据夹层文档)存储在单独的应用程序“configuration文件”中:

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

创build迁移回报:

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

当我运行“迁移configuration文件”时:

 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 

我做错了什么?

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

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

现在,当你运行迁移时, Django会检测到你有一个初始的迁移,并且它想创build的表已经存在,并且将迁移标记为已经被应用

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

你是否清理了应用程序迁移表? 这也是非应用迁移的常见原因。

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

我是一个Django新手,我正在经历同样的问题。 这些答案对我不起作用。 我想分享一下如何解决这个问题,可能会节省很多时间。

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

我做了什么:在shell上运行:

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

发生了什么:

  • 数据库中没有更改

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

原因:

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

– > 我试过了:从该表delete from django_migrations where app = "app-name" app =“my-app-name”的logging( delete from django_migrations where app = "app-name" )。 清除我的迁移文件夹并运行python manage.py makemigration my-app-name ,然后python manage.py migrate my-app-name 。 这是最被投票答案的build议。 但是这也行不通。

为什么? 因为有一个现有的表,我创build的是“初始迁移”,所以Django决定初始迁移已经被应用(因为它认为表已经存在)。 问题是现有的表有不同的模式。

解决scheme1:删除现有表(使用旧模式),进行初始迁移,然后再次应用。 这将工作(它对我来说),因为我们有一个“初始迁移”,并没有在我们的数据库同名的表。 (小提示:我用python manage migrate my-app-name zero来快速删除db中的表)

问题? 您可能想要将数据保留在现有的表中。 你不想丢掉它们,并丢失所有的数据。

解决scheme2:

  1. 使用与现有表相同的模式创build初始迁移,步骤如下:

1.1。 修改您的models.py以与数据库中的当前表匹配

1.2。 删除“迁移”中的所有文件

1.3。 运行python manage.py makemigrations your-app-name

  1. 在django_migrations中删除所有的字段与django_migrations.app =您的应用程序的名称如何做到这一点取决于您使用哪个数据库MySQL的示例: delete from django_migrations where app = "your-app-name";

  2. 修改您的models.py以匹配新的模式(即您现在需要的模式)

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

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

这对我有用。 我设法保留了现有的数据。

更多的想法:我经历了所有这些麻烦的原因是我删除了某些应用程序/迁移/(迁移文件)中的文件。 因此,这些迁移文件和我的数据库是不一致的。 所以我会尝试不修改这些迁移文件,除非我真的知道我在做什么。

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

2-运行python manage.py sqlmigrate <appname> <migrationname> – 您将在appname下的迁移文件夹中findmigrationname(当然,不包含“.py”扩展名)

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

现在所有的更改都应用在你的数据库上

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

python manage.py makemigrations –empty yourappname

python manage.py migrate yourappname

要么:

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

DELETE FROM django_migrations WHERE app=' your-app-name '

然后做:

python manage.py makemigrations python manage.py migrate

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

 python manage.py migrate --fake APPNAME zero 

这会使你的移植成为假货。 现在您可以运行迁移脚本

 python manage.py migrate APPNAME 

表将被创build,你解决了你的问题..干杯!