在 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
?)。在后一种情况下,stderr
或stdout
会更受欢迎吗?
这个问题可以扩展到是否允许用户的交互式输入。内置的模式迁移工具很容易提出与数据相关的交互式问题。
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 1.8 中将数据从原始用户模型迁移到自定义用户模型