【问题标题】:python django issue with the migrations迁移的python django问题
【发布时间】:2015-07-03 08:20:07
【问题描述】:

有没有办法处理迁移?

我一直在使用 1.8 版本的 django,在对 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

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

这种情况应该怎么办?

【问题讨论】:

  • 您需要提供更多数据。请提供更多堆栈。
  • @SylvainBiehler,已添加。
  • 数据库中是否已有数据?具体来说,zapp_post__new.specs_order_post_id 是否已经包含任何空值?
  • @J0HN 是的,数据库中有一些现有数据。但我已经从数据库中删除了 specs_order 字段。
  • 问题中的回溯表明 specs_order_post_id 在您运行迁移时仍然存在。这很可能是因为列中已经存在 NULL,并且迁移没有提供任何提示来说明如何将它们转换为非空值。

标签: python django model migration makemigrations


【解决方案1】:

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

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

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

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

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

但是如果你有敏感数据并且不能删除db,那就更复杂了

【讨论】:

  • @vhd,有点旧的帖子,但是...在我今天遇到的更改 models.py 后解决迁移问题的另一种方法包括清除迁移并重新开始(即零)使用如下命令:python manage.py migrate --fake APPNAME zero 这是我今天早些时候用来解决有问题的迁移问题的参考,就我而言,我不需要放弃我的桌子:simpleisbetterthancomplex.com/tutorial/2016/07/26/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2011-10-26
  • 1970-01-01
  • 2016-07-29
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多