在 Django 数据迁移中可以打印到 stdout 或 stderr 吗?如果是这样,怎么做?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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')

【讨论】:

以上是关于在 Django 数据迁移中可以打印到 stdout 或 stderr 吗?如果是这样,怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Django 模型从 mysql 迁移到 sqlite(或在任何两个数据库系统之间)?

Django 数据迁移

在 django 1.8 中将数据从原始用户模型迁移到自定义用户模型

如何在 django 1.9+ 中合并连续的数据库迁移?

将旧 (Django 0.97) 模型数据导入/迁移到 Django 1.8 或更高版本

django迁移问题