【问题标题】:Is it OK to print to stdout or stderr in Django data migrations? If so, how?在 Django 数据迁移中可以打印到 stdout 或 stderr 吗?如果是这样,怎么做?
【发布时间】:2016-08-31 11:34:46
【问题描述】:

我一直在寻找这方面的任何指导方针,但没有成功。在一个项目中,我经常使用Django data migrations。它们看起来或多或少像文档中的示例。然而,这些操作有时相当复杂,最好有一些控制台输出总结执行的操作(即删除/创建/重新连接/等的内容以及原因)。

所以问题是:将这种日志记录编码到迁移中是否可以?如果是这样,是使用 Python 的 logging 模块还是只使用 print 更好?在前一种情况下,可能需要额外的配置才能使这些日志可见(在settings.py?)。在后一种情况下,stderrstdout 会更受欢迎吗?

这个问题可以扩展到是否允许用户的交互式输入。内置的模式迁移工具很容易提出与数据相关的交互式问题。

Custom management commands 推荐了提供控制台输出的方法,这是这个问题背后的动机的一部分。

【问题讨论】:

    标签: python django django-migrations


    【解决方案1】:

    我认为日志是这里的方式。由于您要在服务器上运行迁移,因此最好将其保存到日志中,以便以后可以随时捕获它。

    【讨论】:

      【解决方案2】:

      stderr 应该在某些功能出现问题时使用。 IE,有一个实际的错误。

      您应该在任何其他时间打印到标准输出。

      因此,如果您的迁移有任何错误,我会将它们重定向到 stderr。否则,我认为 Marshall X 的回答是正确的。如果您需要回顾发生的任何事情并且使用了 print,那么信息根本不存在。

      我会使用日志记录。

      【讨论】:

        【解决方案3】:

        我在复杂的迁移中使用记录器。

        对我来说,打印语句直到迁移完成后才会显示在控制台中。记录器按预期工作。

        我使用这个代码:

        import logging
        
        
        def get_console_logger():
            logger = logging.getLogger(__name__)
            handler = logging.StreamHandler()
            logger.addHandler(handler)
            logger.setLevel(logging.INFO)
        
            logger.info("starting logger")
            return logger
        
        
        def python_actions(apps, schema_editor):
            logger = get_console_logger()
        
            # do usual migraiton stuff
        
            logger.info('use logger as needed')
        

        【讨论】:

          猜你喜欢
          • 2012-04-08
          • 2014-01-09
          • 2017-09-26
          • 2021-06-30
          • 2021-03-20
          • 2013-04-02
          • 2019-01-21
          • 1970-01-01
          • 2011-07-17
          相关资源
          最近更新 更多