编程语言
首页 > 编程语言> > python – Future Agnostic South Data Migrations

python – Future Agnostic South Data Migrations

作者:互联网

我一直在南方开发一个django应用程序,并进行一种松散的连续部署.在我初次迁移后不久,我做了几次数据迁移,看起来像这样:

def forwards(self, orm):                                                   
    from django.core.management import call_command                        
    call_command("loaddata", "#######.json")    

当时,我没有想到任何事情.手动填充数据库然后将其全部转储到夹具中已经很容易了.然后,当我最终写了一些单元测试时,我开始遇到这样的错误:

Creating test database for alias 'default'...
Problem installing fixture '/home/axel/Workspace/02_ereader_blast/content/fixtures/99_deals.json': Traceback (most recent call last):
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 196, in handle
    obj.save(using=using)
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/core/serializers/base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/db/models/base.py", line 551, in save_base
    result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/db/models/manager.py", line 203, in _insert
    return insert_query(self.model, objs, fields, **kwargs)
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 1593, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 910, in execute_sql
    cursor.execute(sql, params)
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
    return self.cursor.execute(query, args)
DatabaseError: Could not load content.BookDeal(pk=1): column "entry_id" of relation "content_bookdeal" does not exist
LINE 1: INSERT INTO "content_bookdeal" ("id", "book_id", "entry_id",...
                                                         ^


Installed 19 object(s) from 1 fixture(s)
Problem installing fixture '/home/axel/Workspace/02_ereader_blast/content/fixtures/99_deals_entries.json': Traceback (most recent call last):
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 190, in handle
    for obj in objects:
  File "/home/axel/Workspace/02_ereader_blast/venv/local/lib/python2.7/site-packages/django/core/serializers/json.py", line 47, in Deserializer
    raise DeserializationError(e)
DeserializationError: Entry has no field named 'book_deals'

据我所知,loaddata命令使用的是我最近的模型,而不是当时的南方状态,并且因为我从那时起已经大大改变了它们,所以当前的模型将旧数据解释为无效.

所以我的问题是:

>设置未来数据迁移的最佳方法是什么,以便不会发生这种情况?
>我如何能够摆脱这种局面,并将其带到最佳实践土地?

解决方法:

我找到了解决方案,这个stackoverflow问题提供了:

django loading data from fixture after backward migration / loaddata is using model schema not database schema

如上面的答案中所述,我使用了一个非常优雅的代码片段,其中loaddata命令获取其模型.

请注意,我确实必须扩大我对这些数据迁移的冻结,以便他们可以从orm而不是直接访问所需的所有模型.

这感觉就像是解决问题的正确方法.

标签:python,serialization,migration,django,django-south
来源: https://codeday.me/bug/20190703/1371314.html