【问题标题】:How can I automatically let syncdb add a column (no full migration needed)如何自动让 syncdb 添加一列(无需完全迁移)
【发布时间】:2026-02-13 02:50:02
【问题描述】:

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


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

【问题讨论】:

标签: django django-models


【解决方案1】:

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

【讨论】:

  • 如果一个 django 模型有一个列而一个数据库没有 - 我得到一个错误。这对其他人有用吗?
  • 在较新版本的 django(例如 1.5)中,使用的命令是 python manage.py sqlclear 而不是 reset
【解决方案2】:

使用迁移工具,例如South

【讨论】:

【解决方案3】:

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

【讨论】:

    【解决方案4】:

    【讨论】:

      【解决方案5】:

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

      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. (可选)修复 DB 文件的权限(在我的情况下,Dropbox 可以搞定)
      5. 从最后一个夹具重新填充新数据库
      6. (可选)重启 apache

      我在开发过程中使用它来备份并从头开始 - 有时如果您添加一个列,它会起作用,有时它会抱怨新定义的模型字段没有数据库列。

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

      显然,我不会在生产安装中这样做,我也不建议这样做。

      【讨论】: