【问题标题】:Does makemigrations in django recreates existing tables for a reason?django 中的 makemigrations 是否出于某种原因重新创建现有表?
【发布时间】:2016-10-15 09:54:03
【问题描述】:

我想用 sql lite 验证 django 1.8 中的 makemigrations 是否存在错误,或者我做错了什么。

  1. 在我删除了我的数据库并删除了所有迁移文件夹之后。我跑了
python manage.py makemigrations 
python manage.py migrate

创建数据库没有问题。

2.我必须在其中一个应用程序(app abc)中修改现有模型 我执行更改并再次运行

python manage.py makemigrations 

3.它没有发现任何变化

然后我再次运行相同的东西,但使用应用程序名称

python manage.py makemigrations abc

4.它在迁移中做了一些更新,我相信它会重新创建所有表,而不仅仅是我的更改!!!!

5.然后我执行

python manage.py migrate

并得到表已经存在的错误。

这是 django 框架中的错误还是我做错了什么,它的行为方式是有原因的?

从第 2 步开始从我的 shell 中复制粘贴:

    (mrp) C:\Users\I812624\dev\mrp\src>python manage.py makemigrations
No changes detected

(mrp) C:\Users\I812624\dev\mrp\src>python manage.py makemigrations purchase
Migrations for 'purchase':
  0001_initial.py:
    - Create model PO
    - Create model POmaterial

(mrp) C:\Users\I812624\dev\mrp\src>python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: customer, manufacture, product, django_filters, a
utofixture, staticfiles, messages, smart_selects, watson, sales, item, django_co
untries, mptt, inventory, django_select2, production, main, crispy_forms
  Apply all migrations: purchase, vendor, sessions, admin, sites, flatpages, con
tenttypes, auth, registration
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying purchase.0001_initial...Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\core\management\__init
__.py", line 338, in execute_from_command_line
    utility.execute()
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\core\management\__init
__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\core\management\base.p
y", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\core\management\base.p
y", line 441, in execute
    output = self.handle(*args, **options)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\core\management\comman
ds\migrate.py", line 221, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\migrations\executor
.py", line 110, in migrate
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=f
ake_initial)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\migrations\executor
.py", line 147, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\migrations\migratio
n.py", line 115, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, projec
t_state)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\migrations\operatio
ns\models.py", line 59, in database_forwards
    schema_editor.create_model(model)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\backends\base\schem
a.py", line 282, in create_model
    self.execute(sql, params or None)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\backends\base\schem
a.py", line 107, in execute
    cursor.execute(sql, params)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\backends\utils.py",
 line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\backends\utils.py",
 line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\utils.py", line 97,
 in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\backends\utils.py",
 line 62, in execute
    return self.cursor.execute(sql)
  File "C:\Users\I812624\dev\mrp\lib\site-packages\django\db\backends\sqlite3\ba
se.py", line 316, in execute
    return Database.Cursor.execute(self, query)
django.db.utils.OperationalError: table "purchase_po" already exists

【问题讨论】:

  • 请粘贴完整的错误回溯
  • 我粘贴了我的shell的所有内容。
  • 通过查看您的日志。 0001_initial.py。在为您的应用创建的第 3 步实际迁移中。您是否从步骤 1 中删除了任何迁移文件?如果数据不重要,请删除数据库并重复上述步骤一切正常。
  • 在第 1 步尝试为所有单个应用创建 makemigrations 然后迁移。
  • 为了更好地了解迁移,请阅读 adding migrations docsanswer

标签: django


【解决方案1】:

回答我自己的问题。

所以我想出了什么。我认为问题在于我最初删除了文件夹迁移,当我在没有指定特定应用程序的情况下运行 makemigrations 时,它确实创建了一个数据库,但它没有在其中创建带有 ____init____.py 的文件夹 makemigrations。

解决方案每当您出于某种原因删除 db 并删除迁移文件夹时,不要只删除迁移文件夹,而只删除其内容,不包括 init 文件。 或者,当您删除文件夹时,请按照@MicroPyramid 的建议为每个应用单独进行迁移。

如果没有进行更深入的调查,我认为它是令人困惑的设计行为或 Django 方面的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2021-04-13
    • 1970-01-01
    • 2012-08-19
    • 2021-11-05
    相关资源
    最近更新 更多