我正在使用一个使用South迁移数据库的操作系统项目.我正在从头开始构建一个新的数据库,我想确保设置South以便将来轻松更新数据库.
看来这个过程应该是:
但是,当我尝试迁移数据库时,早期迁移之一(迁移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
我在导入旧数据时遇到问题,而不是我当前的模型架构.我使用的流程导致错误:
Run Code Online (Sandbox Code Playgroud)File "/usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py",第44行,在执行中返回self.cursor.execute(query,args)DatabaseError:关系"localization_province"的列"mpoly"不存在第1行:... e"("id","name","slug" ,"mpoly")V ...
如果我想加载数据,有没有办法避免在向后迁移后使用模型?
也许我错过了一些非常明显的东西......
PS:我使用South 7.3,Django 1.2.3和PostgreSQL 8.4作为数据库后端.
问题:使用Django时,实现0(或尽可能接近0)停机时间的好策略是什么?
我读到的大多数答案都说"使用南方"或"使用面料",但那些非常模糊的答案恕我直言.我实际上使用了两者,我仍然想知道如何尽可能地实现零停机.
一些细节:
我有一个体积适中的Django应用程序,我在EC2上主持.我使用South进行模式和数据迁移以及使用boto进行结构化,以自动执行通过一组Jenkins(持续集成服务器)任务触发的重复部署/备份任务.我使用的数据库是标准的PostgreSQL 9.0实例.
我有一个...
我们的团队不断编辑的暂存服务器,包含所有新内容,并加载了最新最好的代码和...
不断更改用户帐户和用户数据的实时服务器 - 全部记录在PostgreSQL中.
目前的部署策略:
部署新代码和内容时,会创建两个服务器(实时和暂存)的两个EC2快照.直播切换到"正在更新新内容"页面...
停工开始了.
实时克隆服务器迁移到与登台服务器相同的模式版本(使用南).仅创建我想要保存的表和序列的转储(特别是用户帐户及其数据).完成此操作后,转储将上载到登台克隆服务器.从实时保留的表将被截断并插入数据.随着我的实时服务器中的数据增长,这一次显然在不断增加.
加载完成后,实时服务器的弹性ips将更改为分段克隆(因此它已被提升为新的实时).实时实例和实时克隆实例终止.
停工结束.
是的,这有效,但随着数据的增长,我的"虚拟"零停机时间越来越远.当然,我想到的是以某种方式利用复制并开始研究PostgreSQL复制和"最终一致"的方法.我知道我可以使用负载平衡器做一些魔术,但同时创建的帐户问题使它变得棘手.
我建议你看什么?
更新:
我有一个典型的Django单节点应用程序.我希望有一个解决方案可以更深入地了解django特定问题.例如,我想到了使用Django支持多个数据库以及自定义路由器以及复制的想法.有些问题与我希望回答的问题有关.
我想在我的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中的下一个将完美地运行.
什么是更好的选择?或者还有其他我想念的东西?
我使用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)来测试这个数据迁移.
如何指定要使用的自定义夹具,我可以如何以编程方式向前滚动向前和向后滚动迁移?
我是南方人,所以我想知道我是否需要打电话
./manage.py syncdb
Run Code Online (Sandbox Code Playgroud)
或做
./manage.py schemamigration appname --auto
./manage.py migrate appname
Run Code Online (Sandbox Code Playgroud)
在所有情况下,南方都可以自行处理.
"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文件中注释掉"不可能"的行,但我可以看到导致问题.
每个应用程序的南部迁移不是为了创建的迁移顺序.这可能会导致迁移之间的依赖关系出现问题.有时需要将depends_on属性添加到迁移类.
是否可以按照创建的顺序运行南迁移?而且,任何人都知道为什么南方这样做的原因?
我变得无情了
$ 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,migrate和schemamigration命令不会出现列出.
我仔细检查了我的settings.py文件是否已在"南方"列出INSTALLED_APPS(拉后我没有更改此文件).
我尝试pip uninstall south然后pip install -r requirements.txt再次运行,但我仍然得到同样的错误.
非常感谢任何帮助!
我为我的应用程序扩展了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-south ×10
django ×9
migration ×2
amazon-ec2 ×1
deployment ×1
django-admin ×1
django-apps ×1
pip ×1
postgresql ×1
python ×1
python-2.7 ×1
unit-testing ×1