标签: django-south

如何使用Django South为现有App创建新数据库并设置默认值?

我正在使用一个使用South迁移数据库的操作系统项目.我正在从头开始构建一个新的数据库,我想确保设置South以便将来轻松更新数据库.

看来这个过程应该是:

  1. 创建数据库
  2. 执行syncdb
  3. 迁移

但是,当我尝试迁移数据库时,早期迁移之一(迁移0004并且转到0009)会引发异常:

ValueError: You cannot add a null=False column without a default value.
Run Code Online (Sandbox Code Playgroud)

我不明白如何向迁移0004添加默认值,因此不会抛出此异常.

由于数据库为空,因此无需运行迁移.

但是, south_migrationhistory必须包含所有迁移的列表以及何时应用它们.

我试图破解它,只是手动将迁移0009添加到数据库,但这引发了另一个错误,因为尚未运行中间迁移.我还尝试向数据库添加一个字段,以查看我是否能够找出add_column的语法,其默认值为0.该格式与这些较旧的迁移完全不同.

以下是add_column语法的2个不同版本:

#0004 syntax:  
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'])
#0009 syntax:
syntax db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
Run Code Online (Sandbox Code Playgroud)

所以,我猜测在创建0004和今天之间南方代码发生了变化.

有没有办法用syncdb构建数据库,然后以某种方式更新south_migrationhistory而不运行manage.py migrate?

如果您有一个具有南迁移的现有应用程序,您将如何从头开始构建新数据库?

我无法迁移,因为整数字段没有默认设置.如何在较早的迁移中设置默认值?该领域甚至不再存在.

尝试语法:

db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'], {'default': 0})
#throws ValueError: You cannot add a null=False column without a default value.
db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
#throws AttributeError: Migration instance has no attribute 'gf'
Run Code Online (Sandbox Code Playgroud)

我正在使用South-0.7.2-py2.7.egg

django django-database django-south

11
推荐指数
1
解决办法
1万
查看次数

django在向后迁移/ loaddata之后从fixture中加载数据是使用模型模式而不是数据库模式

我在导入旧数据时遇到问题,而不是我当前的模型架构.我使用的流程导致错误:

  • dumpdata with python manage.py dumpdata - > 0002
  • 对模型做一些修改
  • 使用python manage.py schemamigration app_name --auto - > 0003生成迁移
  • 运行迁移
  • 玩数据库
  • 迁移到0002
  • loaddata生成SQL,其中我有当前(迁移0003)字段,并导致loaddata进程失败(mpoly是添加字段)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py",
Run Code Online (Sandbox Code Playgroud)

第44行,在执行中返回self.cursor.execute(query,args)DatabaseError:关系"localization_province"的列"mpoly"不存在第1行:... e"("id","name","slug" ,"mpoly")V ...

  • 评论在0003之前完成的models.py中的更改,使所有工作正常

如果我想加载数据,有没有办法避免在向后迁移后使用模型?

也许我错过了一些非常明显的东西......

PS:我使用South 7.3,Django 1.2.3和PostgreSQL 8.4作为数据库后端.

django django-south

11
推荐指数
1
解决办法
3869
查看次数

部署(单节点)Django Web应用程序,在EC2上几乎没有停机时间

问题:使用Django时,实现0(或尽可能接近0)停机​​时间的好策略是什么?

我读到的大多数答案都说"使用南方"或"使用面料",但那些非常模糊的答案恕我直言.我实际上使用了两者,我仍然想知道如何尽可能地实现零停机.

一些细节:

我有一个体积适中的Django应用程序,我在EC2上主持.我使用South进行模式和数据迁移以及使用boto进行结构化,以自动执行通过一组Jenkins(持续集成服务器)任务触发的重复部署/备份任务.我使用的数据库是标准的PostgreSQL 9.0实例.

我有一个...

  1. 我们的团队不断编辑的暂存服务器,包含所有新内容,并加载了最新最好的代码和...

  2. 不断更改用户帐户和用户数据的实时服务器 - 全部记录在PostgreSQL中.

目前的部署策略:

部署新代码和内容时,会创建两个服务器(实时和暂存)的两个EC2快照.直播切换到"正在更新新内容"页面...

停工开始了.

实时克隆服务器迁移到与登台服务器相同的模式版本(使用南).仅创建我想要保存的表和序列的转储(特别是用户帐户及其数据).完成此操作后,转储将上载到登台克隆服务器.从实时保留的表将被截断并插入数据.随着我的实时服务器中的数据增长,这一次显然在不断增加.

加载完成后,实时服务器的弹性ips将更改为分段克隆(因此它已被提升为新的实时).实时实例和实时克隆实例终止.

停工结束.

是的,这有效,但随着数据的增长,我的"虚拟"零停机时间越来越远.当然,我想到的是以某种方式利用复制并开始研究PostgreSQL复制和"最终一致"的方法.我知道我可以使用负载平衡器做一些魔术,但同时创建的帐户问题使它变得棘手.

我建议你看什么?

更新:

我有一个典型的Django单节点应用程序.我希望有一个解决方案可以更深入地了解django特定问题.例如,我想到了使用Django支持多个数据库以及自定义路由器以及复制的想法.有些问题与我希望回答的问题有关.

deployment django postgresql amazon-ec2 django-south

11
推荐指数
1
解决办法
1229
查看次数

django和南迁与冲突(0007_two ...和0007_one)如何解决?

我想在我的django项目中使用south作为迁移工具,但是我在多用户场景中使用south有问题:

两个开发人员在不同的计算机上同时工作会创建两个具有相同编号的迁移

  • 在第一台PC上: 0007_extend_lizard.py

  • 在第二台PC上: 0007_swap_name_adopter.py

在这种情况下,我可以运行./manage migrate --merge./manage migrate 0006(回滚)并再次 运行./manage migrate.但是当我想要添加新字段models.py并运行时./manage startmigration southdemo --auto,南方models = {}从上次迁移中获取元数据,并且它在第一次迁移时缺少信息.这样做的结果是创建迁移0008,从第一个0007再次创建(!!!)更改.

解决这个问题的最佳方法是什么?

目前我正在考虑两种选择:

  • 手动将0007迁移合并到一个文件中然后迁移(但有些必须执行"回滚")

  • 手动将缺失models = {}元移动到0007迁移,然后--auto0008中的下一个将完美地运行.

什么是更好的选择?或者还有其他我想念的东西?

migration django django-south

10
推荐指数
1
解决办法
3331
查看次数

如何对Django South"数据迁移"进行单元测试

我使用south创建了一个数据迁移,它采用了一个版本表并将其转换为:

major: 1, minor: 2, micro: 3, release: a
Run Code Online (Sandbox Code Playgroud)

变得更简单:

name: 1.2.3.a
Run Code Online (Sandbox Code Playgroud)

现在我想使用django单元测试(1.3beta)来测试这个数据迁移.

如何指定要使用的自定义夹具,我可以如何以编程方式向前滚动向前和向后滚动迁移?

unit-testing data-migration django-south

10
推荐指数
2
解决办法
1526
查看次数

我需要在South迁移之前或之后调用syncdb

我是南方人,所以我想知道我是否需要打电话

./manage.py syncdb
Run Code Online (Sandbox Code Playgroud)

或做

./manage.py schemamigration appname --auto
./manage.py migrate appname
Run Code Online (Sandbox Code Playgroud)

在所有情况下,南方都可以自行处理.

django django-apps django-syncdb django-south

10
推荐指数
2
解决办法
5317
查看次数

Django南 - 如何放弃错误(和破碎)的迁移

"South"是自动化Django数据库迁移的工具.

我如何"放弃"或"删除"未决的django南迁移?我犯了一个错误并简要地要求django做出一个不可能的约束.因此,我无法通过步骤09进入第10步:

 # python2.7 manage.py migrate --list

 django_authopenid
  (*) 0001_initial
 ...

 mymodule
  (*) 0001_initial
  (*) 0008_auto__add_mystuff__chg_field_facetanswer_answer_note__del_field_facetq
  ...
  ( ) 0009_auto__add_module_redit__add_unique_mystuff_who__chg_field_product_desc
  ( ) 0010_auto__del_unique_mystuff_who
Run Code Online (Sandbox Code Playgroud)

如果我可以简单地放弃步骤09和10,我可以python2.7 manage.py schemamigration --auto再次运行' '并且启动并运行.我怎样才能克服错误?我可以在迁移08的python文件中注释掉"不可能"的行,但我可以看到导致问题.

相关但不太重要的是使用Django South重置迁移历史记录的推荐方法什么?

django django-south

10
推荐指数
1
解决办法
3056
查看次数

django-south迁移令

每个应用程序的南部迁移不是为了创建的迁移顺序.这可能会导致迁移之间的依赖关系出现问题.有时需要将depends_on属性添加到迁移类.

是否可以按照创建的顺序运行南迁移?而且,任何人都知道为什么南方这样做的原因?

django database-migration django-south

10
推荐指数
1
解决办法
2614
查看次数

南:未知命令'迁移'

我变得无情了

$ python manage.py migrate
Unknown command: 'migrate'
Type 'manage.py help' for usage.
Run Code Online (Sandbox Code Playgroud)

我把代码从github上拉到一台新电脑上.此代码已经过测试,可以在其他计算机上运行.整个代码运行正常,除了我无法运行迁移!

安装我的虚拟环境并运行pip install -r requirements.txt.它安装了一切,包括南方.我可以通过跑步检查

$ python manage.py shell
>>> import south
>>> south.__version__
'0.7.3'
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时manage.py help,migrateschemamigration命令不会出现列出.

我仔细检查了我的settings.py文件是否已在"南方"列出INSTALLED_APPS(拉后我没有更改此文件).

我尝试pip uninstall south然后pip install -r requirements.txt再次运行,但我仍然得到同样的错误.

非常感谢任何帮助!

python migration django pip django-south

10
推荐指数
3
解决办法
2万
查看次数

Django代理模型权限不会出现

我为我的应用程序扩展了Django管理站点,允许非员工/超级用户访问.这工作得很好.

我为现有模型创建了一个代理模型,并将其注册到我的管理站点,但是,对于非员工用户,它不会出现.从我阅读的文档中,我的理解是代理模型获得了自己的权限.我检查过,这些没有出现在可用权限列表中.

这是我的代码,以防它有用:

正常模型

class Engagement(models.Model):
    eng_type = models.CharField(max_length=5)
    environment = models.CharField(max_length=8)    
    is_scoped = models.BooleanField()    

    class Meta:
        ordering = ['eng_type', 'environment']
        app_label = 'myapp'
Run Code Online (Sandbox Code Playgroud)

代理模型

class NewRequests(Engagement):
    class Meta:
        proxy = True
        app_label = 'myapp'
        verbose_name = 'New Request'
        verbose_name_plural = 'New Requests'
Run Code Online (Sandbox Code Playgroud)

模特管理员

class NewRequestsAdmin(ModelAdmin):
pass

def queryset(self, request):
    return self.model.objects.filter(is_scoped=0)
Run Code Online (Sandbox Code Playgroud)

自定义管理员注册

myapps_admin_site.register(NewRequests, NewRequestsAdmin)
Run Code Online (Sandbox Code Playgroud)

我一直在和南方管理我的数据库.根据这篇文章,您必须按照它指向用户的说明稍微篡改它.这是一次失败.我的数据库中没有很多信息,因此我取消注释南并运行常规syncdb以排除South.不幸的是,这仍然没有用,我不知所措.任何帮助表示赞赏.

编辑

这是在Django 1.4上

django django-models django-admin django-south python-2.7

10
推荐指数
3
解决办法
4791
查看次数