启动时自动运行django-admin迁移

时间:2019-02-07 10:37:34

标签: python django

我正在尝试简化Django应用程序的安装过程。步骤之一是运行django-admin.py migrate,当使用Gunicorn,uWSGI或mod_wsgi启动应用程序时,有什么方法可以自动运行它。

编辑:弄清启动时的意思。

edit2:这是我共同维护的一个开源应用程序。我没有部署它。它是由通常对Django一无所知的常规系统管理员部署的。一个抱怨是该应用程序难以部署,因为需要执行所有这些手动管理步骤。要求他们在其部署工具中创建一些脚本不会使安装更加容易。我想要的是,然后启动应用程序时,它会检查是否有数据库,如果没有,则运行manage.py migrate

edit3:部署通常通过pip

2 个答案:

答案 0 :(得分:0)

这取决于您使用的流程管理器,如果您是手动启动它或通过脚本启动它,只需在运行之前运行manage.py migration,我就可以使用超级用户并像这样将它添加为程序

[program:migrate]
command = python manage.py migrate
autorestart = false
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

任何进程管理器都可以执行此操作,只需确保将其设置为在迁移完成后该命令消失就不会重新启动。

答案 1 :(得分:0)

这通常会进入部署脚本中,具体取决于您在目标环境中更新Django应用程序的例程。

您不仅需要运行迁移,还可能需要执行一系列通话:

  • 迁移
  • collectstatic(通常将它们放在一个目录中,然后再由代理(例如nginx)直接提供服务,因为Django相对而言速度较慢)
  • 编译消息(生成* .mo翻译文件)

要在设置中获得最大的灵活性,您可以创建一个名为{.3}的setup.py来完成所有操作。如果您需要初始化数据,这也可以加载数据库夹具。

这是我在setup.py中所做的摘录:

def handle(self, *args, **options):
    LOGGER.info('Setup: translations ...')
    call_command('compilemessages', locale=['de'], verbosity=2)
    LOGGER.info('Setup: translations ... DONE')

    LOGGER.info('Setup: DB check and fixtures ...')

    db_error = self.load_db(options)
    if db_error:
        if options['wait_db']:
            while db_error:
                LOGGER.warning('%s - retrying in 5 secs...', db_error)
                time.sleep(5)
                db_error = self.load_db(options)
        else:
            LOGGER.error(db_error)
    LOGGER.info('Setup: DB check and fixtures ... %s', 'FAILED' if db_error else 'OK')

    LOGGER.info('Setup: collectstatic to %s ...', settings.STATIC_ROOT)
    cs_error = None
    try:
        call_command('collectstatic', '--clear', '--noinput')
    except FileNotFoundError as fnfe:
        cs_error = fnfe
        LOGGER.warning('Error during "collectstatic": %s', fnfe)
    LOGGER.info('Setup: collectstatic ... %s', 'WARN' if cs_error else 'OK')

def load_db(self, options):
    try:
        call_command('migrate')
        if not User.objects.count():
            call_command('loaddata', 'auth.json')
            LOGGER.info('Setup: loaded fixture auth.json')
    except DatabaseError as dbe:
        return dbe

如果您通过GIT部署,则可以使用GIT post_merge钩子或类似的钩子,该钩子运行bash脚本,以调用所需的任何manage.py命令。

如果您是通过 Docker 进行部署的,则可以将对./manage.py setup的调用放入docker-entrypoint.sh脚本中,该脚本在运行Docker映像时就会被调用。