我./manage.py schemamigration junk_app --initial刚刚安装完南(http://south.aeracode.org/)之后就运行了一个全新的django项目,我收到以下错误:
Unknown command: 'schemamigration'
Type 'manage.py help' for usage.
Run Code Online (Sandbox Code Playgroud)
编辑:我有版本.7(南/ init.py有版本 =".07")
下面几乎是刚刚发生的文字复制/粘贴:
$ sudo apt-get install python-django-south
$ django-admin.py startproject junk_proj
$ cd junk_proj
$ ./managy.py startapp junk_app
$ vim settings.py #add 'south' to INSTALLED_APPS
Run Code Online (Sandbox Code Playgroud)
.
$ cat settings.py
# Django settings for junk_proj project.
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
import os
CWD = os.getcwd()
DATABASE_ENGINE …Run Code Online (Sandbox Code Playgroud) 我想知道在项目的初期开发过程中使用(django)South的优势.
在开发的早期阶段,通常会有快速的模型更改,频繁的分支和合并(特别是如果您使用像git-flow这样的开发策略)和非常少的存储数据(如果有的话).为什么要保留这些初始模型更改?有什么优点/缺点?
我认为,在激活South并执行初始迁移之前,更容易等到开发阶段结束(并且您有实际想要保留的数据).有可能吗?你想要那样做吗?
我正在使用我的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应用程序的人,您如何处理数据库迁移?我知道有south,但如果涉及任何实质性的事情,似乎会错过很多.
另外两个选项(我能想到或已经使用过)是在测试数据库上进行更改,然后(使用应用程序脱机)并导入该sql导出.或者,也许是一个风险更高的选择,实时对生产数据库进行必要的更改,如果出现任何问题,还原为备份.
您通常如何处理数据库迁移和架构更改?
我有一个模特
class Category(models.Model):
title = models.CharField(...)
entry = models.ManyToManyField(Entry,null=True,blank=True,
related_name='category_entries',
)
Run Code Online (Sandbox Code Playgroud)
我希望重构每个关系的附加数据:
class Category(models.Model):
title = models.CharField(...)
entry = models.ManyToManyField(Entry,null=True,blank=True,
related_name='category_entries',
through='CategoryEntry',
)
Run Code Online (Sandbox Code Playgroud)
但是南方删除了现有的表格.我如何保留现有的mtm关系?
我已经为我的一些模型添加了一个UUID字段,然后与South一起迁移.我创建的任何新对象都正确填充了UUID字段.但是,我所有旧数据的UUID字段都为空.
有没有办法为现有数据填充UUID数据?
使用South/Django,我遇到了一个问题,我正在尝试为数据库中现有行的模型添加一个UNIQUE和NOT NULL列.South提示我为列指定默认值,因为它是NOT NULL.但是,因为它也有一个UNIQUE限制,我无法在默认models.py添加到外地,我也可以指定一个一次性的价值,因为它会在所有行相同.
我能想到的解决这个问题的唯一方法是先创建一个空的列,应用迁移,运行一个脚本来填充该列中唯一值的现有行,然后添加其他移民到加UNIQUE约束的列.
但有没有更好的方法来完成同样的事情?
我正在使用sqlite3和pycharm来了解有关django的更多信息,并且谷歌搜索发现南方建议在创建模型后更容易修改模型.
我正在尝试遵循http://south.aeracode.org/docs/tutorial/part1.html#starting-off上的建议.
到目前为止,我最成功的是创建一个简单的模型并在向south_apps添加南之前运行syncdb.这样就创建了初始表,我有机会创建一个超级用户.(如果没有用户,Django管理员似乎会担心).
然后我将south添加到installed_apps,并运行django_manage.py schemamigration书签--initial
它似乎工作正常.创建一个名为migrations的新目录,其中包含我的app文件夹中的几个文件以及一条令人鼓舞的消息."已创建0001_initial.py.您现在可以将此迁移应用于:./ manage.py迁移书签"
下一步 - django_manage.py"迁移书签会生成以下错误消息:django.db.utils.DatabaseError:没有这样的表:south_migrationhistory.
我认为该表将在第一个schememigration步骤中创建.我错过了什么?有人可以帮忙吗?
玛格
我是从更改字段CharField来IntegerField.字段名称保持不变.新创建的字段将基于旧字段.例如,如果旧字段是"L",则它将具有数字"1".我怎样才能在forwards()功能中实现这一目标?
所以我开始在我的Django Web服务器上遇到南方的一些问题.每次使用此输出迁移命令失败:
from django.db import models, migrations
ImportError: cannot import name migrations
Run Code Online (Sandbox Code Playgroud)
(在此之上,错误显示无法迁移的文件的路径)
我的Django版本是1.5.1,而我的南版本是0.8.4
让我最烦恼的是模块django.db.migrations无处可寻.
有任何想法吗?