我有一个Django应用程序.我有包含测试数据的.json fixture文件,单元测试使用数据来确认应用程序是否正常工作.我还使用South来迁移我的数据库.
做了几个数据库迁移后,我的灯具已经过时了,因为数据库已迁移,添加一个新的数据库列,例如,与夹具数据不具有该列,因为它在数据库中更改前被抓获.
在迁移数据库时,移动我的灯具的最佳方法是什么?
我想在我的数据库中清除一个表,所以我放弃了表.通常我会manage.py syncdb重新创建它.但是,这里的答案说不再使用syncdb了.那么,我该怎么做呢?
在Heroku上,只要您推送新代码,即使尚未应用基础数据库架构添加/更改(通过syncdb或南迁移),Web服务实例也会重新启动.
在许多情况下,这可能只会导致无害的错误,并且很快就会运行syncdb/migrate.但是我担心在某些情况下,新代码可能会在迁移前数据库中进行意外更改.
什么是安全抵御这种风险的正确方法?
一种技术可能是将syncdb/migrate添加到Procfile,以便在web重启之前运行.但是,在多个实例的情况下,或者甚至可能是一个旧的代码实例一直运行直到一个新的代码实例被知道的情况下,仍然存在一个问题的变体,其中代码是与具有不匹配架构的DB交谈.
是否存在"保留所有Web实例"功能(或常见的最佳实践),以便在没有Web流量的情况下完成迁移?
或者我过度担心在实践中可以忽略不计的风险?
我做了一个模型改变
standard = models.ManyToManyField(Standard)
Run Code Online (Sandbox Code Playgroud)
至
standard = models.ManyToManyField(Standard, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
此应用程序的南模式迁移无法识别更改?
类似于这个问题,这个问题没有得到解决: 南方迁移和许多可能领域的变化
django django-models database-schema django-south django-migrations
当我使用Django South删除NOT NULL字段时,我收到以下消息:
? The field 'VisitOrder.end_date' does not have a default specified, yet is NOT NULL. ? Since you are removing this field, you MUST specify a default ? value to use for existing rows. Would you like to: ? 1. Quit now, and add a default to the field in models.py ? 2. Specify a one-off value to use for existing columns now ? 3. Disable the backwards migration by raising an exception. ? Please select a choice: …
我刚刚安装了South 1.0,当我即将进行第一次迁移时,我收到了以下错误消息:
... /lib/python3.4/site-packages/south/migration/migrators.py", line 186, in _run_migration
for name, db in south.db.dbs.iteritems():
AttributeError: 'dict' object has no attribute 'iteritems'
Run Code Online (Sandbox Code Playgroud)
我通过用items()替换两次出现的iteritems()来修复它.
我的问题是:
令我惊讶的是,我找不到任何遇到同样问题的人.
我遇到了评论者提出的同样问题:Django South - 表已经存在
没有后续行动,所以我想我会发一个新问题.我有一个Django应用程序,我在南方管理它的迁移.我在模型中添加了一个字段然后运行
./manage schemamigration my_app --auto
Run Code Online (Sandbox Code Playgroud)
按预期运行.运行
./manage migrate my_app
Run Code Online (Sandbox Code Playgroud)
但是,导致错误,表明与我更改的模型关联的表已经存在.这导致我上面的链接问题,所以运行
./manage migrate my_app --fake
Run Code Online (Sandbox Code Playgroud)
解决了表错误,但现在我收到一个Django错误,表明与新字段关联的列不存在.
./manage sqlall my_app
Run Code Online (Sandbox Code Playgroud)
显示架构符合预期.
任何关于如何补救这一点的想法都表示赞赏!
所以我试图通过向其添加两列来迁移表.A startDate和endDate.使用southDjango,这应该是一个简单的迁移.我还有大量其他带有dateTimes的表格,但由于某种原因,我在这里得到并发布,我没有看到它.
堆栈跟踪说明:
AttributeError: 'DateTimeField' object has no attribute 'model'
Run Code Online (Sandbox Code Playgroud)
这是我正在迁移的模型:
# Keep track of who has applied for a Job
class JobApply(models.Model):
job = models.ForeignKey(Jobs)
user = models.ForeignKey(User)
# Keep track of the Developer accepted to do the work
accepted_dev = models.IntegerField(null=False, blank=False, default=0)
# If 1 (True) the User has applied to this job
isApplied = models.BooleanField(default=0)
startDate = models.DateTimeField()
endDate = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
DB中除了startDate并且endDate已经存在的所有字段.因此,为了给这些列提供默认值,我通过终端使用datetime.date.now()来保持一切正方形.问题是,南方的schemamigration工作正常,但实际的迁移barfs.
如果有人能看到错误,我的头发会很感激.:P
编辑:包括Stacktrace: …
我想知道什么是与多个开发人员一起使用South的"最佳"方式.
是否应跟踪迁移文件?当两个开发人员对同一来源的models.py进行不同的更改时,问题就会出现.
如果跟踪迁移文件:
如果没有跟踪它们:
我错过了更多优点/缺点吗?最好的方式是什么?我目前正在使用跟踪迁移,但考虑改为未跟踪,似乎更简单.
谢谢.
我正在使用我的Django应用程序.我有两个模型,我正在改变与ForeignKey关系的OneToOneField关系.当我在我的dev数据库上运行此迁移时,它运行正常.当迁移作为创建测试数据库的一部分运行时,最新的迁移失败,出现MySQL 1005错误:"无法创建表mydb.#sql-3249_1d(错误号:121)".做一些谷歌搜索显示,这通常是尝试添加与现有约束具有相同名称的约束的问题.它失败的迁移中的特定行是:
关系改变自:
class MyModel(models.Model):
othermodel = models.ForeignKey(OtherModel)
Run Code Online (Sandbox Code Playgroud)
至
class MyModel(models.Model):
othermodel = models.OneToOneField(OtherModel)
Run Code Online (Sandbox Code Playgroud)
在迁移中生成以下语句:
db.alter_column('myapp_mymodel', 'othermodel_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['myapp.OtherModel'], unique=True))
db.create_unique('myapp_mymodel', ['othermodel_id'])
Run Code Online (Sandbox Code Playgroud)
但是create_unique,它没有在alter_column通话中失败,而是在通话失败.我运行以下命令来查看正在生成的SQL:
python manage.py migrate myapp 0010 --db-dry-run --verbosity=2
Run Code Online (Sandbox Code Playgroud)
它打印出来了
myapp:0010_auto__chg_field_mymodel_othermodel__add_unique_mymodel
= ALTER TABLE `myapp_mymodel` ADD CONSTRAINT `myapp_mymodel_othermodel_id_uniq` UNIQUE (`othermodel_id`) []
= SET FOREIGN_KEY_CHECKS=1; []
= ALTER TABLE `myapp_mymodel` ADD CONSTRAINT `myapp_mymodel_othermodel_id_uniq` UNIQUE (`othermodel_id`) []
Run Code Online (Sandbox Code Playgroud)
它试图运行ADD CONSTRAINT两次似乎很奇怪,但是如果我删除了db.create_unique调用,当我运行它时没有生成SQL ,但是如果我真的运行它--db-dry-run仍然会得到错误.
我在这里不知所措,任何帮助表示赞赏.
django ×10
django-south ×10
python ×4
database ×1
fixtures ×1
heroku ×1
migration ×1
mysql ×1
postgresql ×1
python-3.x ×1