如何自动让syncdb添加列(不需要完全迁移)

时间:2010-10-13 13:52:13

标签: django django-models

当我对模型进行更改时(仅在开发期间添加列!),Django不会发出任何ALTER TABLE语句来更新数据库。有没有办法实现或解决这个问题? - 其他然后手动添加列?


注意我并不是真的在寻找一个完全迁移的解决方案,只是让我在路上添加列时可以继续编码。

5 个答案:

答案 0 :(得分:23)

python manage.py sqlclear YOURAPPdumpdataloaddata结合使用(fish2000的简化版本,也使用特定应用):

DB=/path/to/db.sqlite3
APP=YOURAPPNAME
tmpdate=$(date "+%Y%m%d-%H%M%S")

echo "+ Dumping django project database to fixture DUMP-${tmpdate}.json ..." &&\
python manage.py dumpdata $APP --format='json' --indent=4 --verbosity=1 > datadumps/DUMP-${tmpdate}.json &&\
echo '+ Backing up sqlite binary store...' &&\
cp $DB $DB.bk &&\
echo '+ Rebuilding database structure from model defs...' &&\
python manage.py sqlclear $APP &&\
echo "+ Reloading project data from fixture dump DUMP-${tmpdate}.json ..." &&\
python manage.py loaddata datadumps/DUMP-${tmpdate}.json

答案 1 :(得分:20)

使用迁移工具,例如South

答案 2 :(得分:5)

抱歉,这有点晚了,但我想我会在这里发布,以防其他人遇到这个问题。如果您仍在开发中并且所有数据都是虚拟数据(意味着您不想保留任何数据),那么您所要做的就是删除数据库并再次运行syncdb。

答案 3 :(得分:4)

答案 4 :(得分:3)

如果您不想设置迁移 - 您可以使用这样的技巧:

export JANGY_PROJECT='/Users/fish/Dropbox/ost2/ost2'
export BPYTHON_INIT_SCRIPT='${JANGY_PROJECT}/utils/django_shell_imports.py'
export PYTHONPATH="${JANGY_PROJECT}:${PYTHONPATH}"

alias jangy="python manage.py"
alias bp="cd $JANGY_PROJECT && bpython --interactive $BPYTHON_INIT_SCRIPT"


function jangyfresh () {
    tmpdate=$(date "+%Y%m%d-%H%M%S") &&\
    cd $JANGY_PROJECT &&\
    echo "+ Dumping django project database to fixture DUMP-${tmpdate}.json ..." &&\
    python manage.py dumpdata --format='json' --indent=4 --verbosity=1 > datadumps/DUMP-${tmpdate}.json &&\
    echo '+ Backing up sqlite binary store and taking database offline...' &&\
    mv sqlite/data.db sqlite/data.db.bk &&\
    echo '+ Rebuilding database structure from model defs...' &&\
    python manage.py syncdb &&\
    echo '+ Graceful-restarting Apache...' &&\
    sudo apachectl graceful &&\
    echo '+ Enabling write access on new sqlite file...' &&\
    chmod a+rw sqlite/data.db &&\
    echo "+ Reloading project data from fixture dump DUMP-${tmpdate}.json ..." &&\
    python manage.py loaddata datadumps/DUMP-${tmpdate}.json &&\
    echo '+ Rebuilding project database structure...'
}

... bash函数的作用是:

  1. 将数据库转储到灯具, 以日期/时间戳命名
  2. 备份和删除 二进制数据库文件(SQLite在此 这种情况比较容易 删除有问题的文件)
  3. 从模型中重新同步数据库(重新生成二进制数据库文件)
  4. (可选)修复数据库文件的权限(在我的情况下,dropbox可以使用它)
  5. 从最后一个夹具重新填充新数据库
  6. (可选)重启apache
  7. 我在开发过程中使用它来备份并从头开始 - 有时候如果你添加一个列就行了,有时它会抱怨新定义的模型字段没有数据库列。

    在这些情况下,我运行命令,编辑models.py文件,删除sqlite文件并重新加载最后一个夹具。

    显然,我不是在生产安装上执行此操作,也不建议这样做。