0

有没有办法处理迁移?

我一直在使用 django 1.8 版,在对 models.py 进行任何更改之后,我们需要运行以下命令 -

python manage.py makemigrations
python manage.py migrate

很多时候,这会产生错误。碰巧我不得不重建项目,因为没有出路。

我也尝试了以下出路,但都没有奏效。

  • 删除了迁移文件夹
  • 撤消对 model.py 的更改
  • 删除了迁移文件夹中的文件
  • 尝试冲洗,挤压迁移

它每次都显示以下错误,其中包含一些未知文件的非常长的错误日志。

帖子编辑:这是整个日志

File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/core/management/commands/migrate.py", line 221, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/migrations/executor.py", line 110, in migrate
self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/migrations/executor.py", line 147, in apply_migration
state = migration.apply(state, schema_editor)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/migrations/migration.py", line 115, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/migrations/operations/fields.py", line 62, in database_forwards
field,
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/backends/sqlite3/schema.py", line 179, in add_field
self._remake_table(model, create_fields=[field])
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/backends/sqlite3/schema.py", line 147, in _remake_table
self.quote_name(model._meta.db_table),
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/backends/base/schema.py", line 111, in execute
cursor.execute(sql, params)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/utils.py", line 97, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/db/backends/sqlite3/base.py", line 318, in execute
return Database.Cursor.execute(self, query, params)

django.db.utils.IntegrityError:NOT NULL 约束失败:zapp_post__new.specs_order_post_id

这是我的项目的链接,目前正在显示错误。您可以尝试运行应用程序

在这种情况下应该怎么做?

4

1 回答 1

2

下载您的代码,删除 db.sqlite3,运行 syncdb,一切正常。由于您的数据库中没有任何敏感数据,我认为这对您有用。

这里有一些额外的信息供将来使用:

手动修改迁移/数据库或遇到迁移问题时,您应该考虑以下事项:

  • 您不应该删除迁移文件夹
  • 迁移文件夹应始终包含__init__.py文件
  • 所有应用的迁移都存储在 django_migrations 表中,所以如果你删除所有的迁移文件并重新进行迁移(即创建一个新的 0001_initial.py),运行 migrate 不会做任何事情,因为 django 认为它已经应用了
  • 有时删除 django_migrations 表中的特定行并修改表结构(根据已删除的行)可以解决问题,但您应该知道自己在做什么。

因此,当您遇到迁移问题时,最简单的解决方案是删除迁移文件夹中的所有文件(除了__init__.py),删除 django_migrations 表中 app=your_app_name 的所有行,删除应用程序的所有表,然后重新进行迁移并应用它们。

但是如果你有敏感数据并且你不能删除数据库,它会变得更加复杂

于 2015-07-03T09:08:55.517 回答