Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在Django中更改数据库表_Database_Django - Fatal编程技术网

Database 在Django中更改数据库表

Database 在Django中更改数据库表,database,django,Database,Django,我正在考虑将Django用于我正在启动的项目(仅供参考,这是一款基于浏览器的游戏),我最喜欢的功能之一是使用syncdb根据我定义的Django模型自动创建数据库表(这是我在任何其他框架中都找不到的功能)。 我已经在想这是太好了,当我看到这在: Syncdb不会更改现有表 syncdb将仅为尚未安装的模型创建表。它永远不会发出ALTERTABLE语句来匹配安装后对模型类所做的更改。对模型类和数据库模式的更改通常涉及某种形式的歧义,在这种情况下,Django必须猜测正确的更改。在此过程中存在关键数

我正在考虑将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)