django migrate db

本地生成migrate文件

Django里面如果修改了model,需要运行python manage.py makemigrations来生成sql变更文件,然后部署到生产环境时执行python manage.py migrate将改动应用到生产环境的DB。

在makemigrations有几个注意事项:

  1. 多个开发人员在同一个开发环境多次migrate修改数据库,导致生成的sql文件冗余
  2. 在本地运行python manage.py makemigrations命令需要连接数据库才能操作

这里公司的资深工程师给了一个可行的操作,对django配置一个setting_local.py的配置文件,里面的数据库使用sqlite,以其为db进行migrate操作,代码测试通过后再把sql变更文件提交到版本库中。

版本回退

如果项目上线遇到问题,需要做版本回退,不仅要把代码回退,而且还要把数据库回滚。命令如下:

# help info
python manage.py migrate --help
usage: manage.py migrate [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                         [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                         [--noinput] [--database DATABASE] [--fake]
                         [--fake-initial] [--run-syncdb]
                         [app_label] [migration_name]

# demo command
python manage.py migrate --settings config.settings_dev private_build_configs 0024

app_label指settings.py中INSTALLED_APPS的值,比如:

INSTALLED_APPS = [
    'django.contrib.contenttypes',
    'private_build_configs',
    '...'
]

migration_name指app_label/migratations下面具体的迁移文件:

(razzilenv) ➜  razzil git:(master) ✗ ls -al private_build_configs/migrations | grep -v pyc
total 440
drwxr-xr-x  58 adolphlwq  staff  1856 Apr 12 16:45 .
drwxr-xr-x  15 adolphlwq  staff   480 Apr 12 17:02 ..
-rw-r--r--   1 adolphlwq  staff  3092 Oct 23 14:25 0001_initial.py
......
-rw-r--r--   1 adolphlwq  staff   495 Apr 12 16:45 0025_buildconfig_allow_artifact_upload_fail.py
-rw-r--r--   1 adolphlwq  staff     0 Oct 23 14:25 __init__.py

sqlmigrate调试

所以如果migrate失败了,可以用sqlmigrate调试。

python manage.py sqlmigrate private_build_configs 0025 --settings config.settings_dev
comments powered by Disqus