Database 在Django中更改数据库表
我正在考虑将Django用于我正在启动的项目(仅供参考,这是一款基于浏览器的游戏),我最喜欢的功能之一是使用Database 在Django中更改数据库表,database,django,Database,Django,我正在考虑将Django用于我正在启动的项目(仅供参考,这是一款基于浏览器的游戏),我最喜欢的功能之一是使用syncdb根据我定义的Django模型自动创建数据库表(这是我在任何其他框架中都找不到的功能)。 我已经在想这是太好了,当我看到这在: Syncdb不会更改现有表 syncdb将仅为尚未安装的模型创建表。它永远不会发出ALTERTABLE语句来匹配安装后对模型类所做的更改。对模型类和数据库模式的更改通常涉及某种形式的歧义,在这种情况下,Django必须猜测正确的更改。在此过程中存在关键数
syncdb
根据我定义的Django模型自动创建数据库表(这是我在任何其他框架中都找不到的功能)。
我已经在想这是太好了,当我看到这在:
Syncdb不会更改现有表
syncdb将仅为尚未安装的模型创建表。它永远不会发出ALTERTABLE语句来匹配安装后对模型类所做的更改。对模型类和数据库模式的更改通常涉及某种形式的歧义,在这种情况下,Django必须猜测正确的更改。在此过程中存在关键数据丢失的风险
如果对模型进行了更改,并希望更改数据库表以匹配,请使用sql命令显示新的sql结构,并将其与现有的表架构进行比较,以确定更改
看来,改变现有表格将不得不“手工”完成
我想知道的是最好的方法。我想到了两个解决方案:
- 如文件所示,在数据库中手动进行更改李>
- 备份数据库,擦除它,再次创建表(使用syncdb,因为现在它是从头开始创建表)并导入备份的数据(如果数据库很大,这可能需要很长时间)
有什么想法吗?手动执行SQL更改和转储/重新加载都是可选的,但是您可能还想查看Django的一些模式演化包。最成熟的选择是和 编辑:嘿,来了 更新:由于这个答案最初是编写的,并且都停止了积极的开发,并且已经成为Django中模式迁移的事实标准。South的一部分甚至可能在下一两个版本中集成到Django中
更新:Django 1.7+中包含了一个基于South(由South作者Andrew Godwin编写)的模式迁移框架。一个好方法是通过fixture,特别是
初始数据
fixture
fixture是包含数据库序列化内容的文件集合。因此,这就像有一个数据库备份,但Django意识到这一点,它更易于使用,并且在进行单元测试时会有额外的好处
您可以使用django-admin.py dumpdata
从数据库中当前的数据创建一个fixture。默认情况下,数据为JSON格式,但也可以使用其他选项,如XML。存储装置的好地方是应用程序目录的fixtures
子目录
您可以使用django-admin.py loaddata
加载固件,但更重要的是,如果您的固件的名称类似于initial_data.json
,则在执行syncdb
时,它将自动加载,省去了您自己导入它的麻烦
另一个好处是,当您运行manage.py test
来运行单元测试时,临时测试数据库也将加载初始数据
当然,当您向模型添加属性并向数据库添加列时,这将起作用。如果从数据库中删除列,则需要更新fixture以删除该列的数据,这可能并不简单
在开发过程中进行大量小的数据库更改时,这种方法效果最好。为了更新生产数据库,手动生成的SQL脚本通常最有效。我一直在使用django evolution。警告包括:
- 它自动提出的建议已经被一视同仁地破坏了;及
- 它的指纹函数为不同平台上的同一数据库返回不同的值李>
schema\u evolution.py
方法很方便。要解决指纹问题,我建议使用如下代码:
BEFORE = 'fv1:-436177719' # first fingerprint
BEFORE64 = 'fv1:-108578349625146375' # same, but on 64-bit Linux
AFTER = 'fv1:-2132605944'
AFTER64 = 'fv1:-3559032165562222486'
fingerprints = [
BEFORE, AFTER,
BEFORE64, AFTER64,
]
CHANGESQL = """
/* put your SQL code to make the changes here */
"""
evolutions = [
((BEFORE, AFTER), CHANGESQL),
((BEFORE64, AFTER64), CHANGESQL)
]
如果我有更多的指纹和变化,我会重新考虑。在那之前,让它更干净将是从其他东西中窃取开发时间
编辑:鉴于我仍在手动构建更改,我下次将尝试 是一个django库,它提供了一些额外的命令来管理.py。其中之一是sqldiff,它应该为您提供更新到新模型所需的sql。然而,它被列为“非常实验性的”。正如对同一主题的其他回答所指出的,请务必在YouTube上观看
另外,地图上有两个新项目:和。到目前为止,在我的公司,我们使用了手动方法。什么最适合你取决于你的发展风格 在生产系统中,我们通常没有太多的模式更改,从开发到生产服务器的部署也没有多少形式化。每当我们推出(每年10-20次)时,我们都会对当前和即将推出的生产分支进行填充差异,检查所有代码,并注意生产服务器上需要更改的内容。所需的更改可能是其他依赖项、设置文件的更改和数据库的更改
这对我们很有效。将其全部自动化是一个利基愿景,但对我们来说很困难-也许我们可以管理迁移,但我们仍然需要处理额外的库、服务器等依赖项。Django 1.7(目前正在开发中)用于模式迁移,使用
manage.py migrate
和manage.py makemigrations
(migrate
反对syncdb
)。对于添加、删除或重命名字段等简单的演化,django evolution对我来说效果很好。有时我不得不添加一个默认值,而不是在模型中指定(而是告诉django-e)