Django IPython 报错 "naive datetime",可能与 sqlite 有关。

16

我在 Django 1.4 中有一个新项目,使用 sqlite 数据库。同时使用 django_extenstions 的 shell_plus 没有问题。

当我安装了 IPython 后,shellshell_plus 都开始出现以下错误:

/path/to/my/virtualenv/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:50:
RuntimeWarning: SQLite received a naive datetime (2012-07-29 13:15:45.229464) while time zone support is active.

看起来IPython本身使用不带时区信息的日期时间格式。如何解决这个问题?

编辑:

我不想禁用Django的时区支持。


@PeterStahl 确实,这不是一个真正的问题,只要我不从 shell 创建日期时间并将它们保存到 Django 模型中,而且还在一年中“不确定”的时间,可能接近夏令时变化等等... :) 即使这样,Django 也可能会发出警告。但是...好吧,这看起来不太好!:)) - frnhr
@PeterStahl 可以把它写成答案... - frnhr
1
请参阅 https://code.djangoproject.com/ticket/19738 了解Django对此问题的讨论。目前还没有出现令人满意的解决方案。 - Carl Meyer
3个回答

15

我把这个放在了我的local_settings.py文件中:

#ignore the following error when using ipython:
#/django/db/backends/sqlite3/base.py:50: RuntimeWarning:
#SQLite received a naive datetime (2012-11-02 11:20:15.156506) while time zone support is active.

import warnings
import exceptions
warnings.filterwarnings("ignore", category=exceptions.RuntimeWarning, module='django.db.backends.sqlite3.base', lineno=53)

3
太棒了,它完美地运行了!仅就代码放置位置再精确一些:将其放置在Django项目的settings.py文件中即可。您不需要为此创建名为local_settings.py的另一个文件。 - pemistahl
1
我必须稍微修改一下,以过滤掉警告信息。warnings.filterwarnings("ignore", category=exceptions.RuntimeWarning, module='django.db.backends.sqlite3.base', lineno=53) - yellottyellott
2
非常重要的是要意识到通过这样做,您会面临可能发生数据损坏的风险。如果您编写保存原始日期时间到SQLite数据库的代码,并使用原始SQL查询,在此“修复”情况下,Django将无法再向您发出警告。 - Carl Meyer
1
"前方有一座冰山!"..."让那个人和他的后代保持沉默!" - orokusaki
Django 1.8的行号为57。 - Bob Stein

12
我遇到了相同的问题,但我认为这并不是一个真正的问题。IPython 内部似乎使用天真的日期时间,而 Django 只是发出警告。Django 在打开时区支持和检测到天真日期时间时总是发送此警告。在我的计算机上,只有当我启动或关闭 IPython 时才会出现此警告。这个警告不会以任何方式影响你在 IPython 中的工作。因此,你可以安全地在 IPython 中正常创建已知日期时间,并将其保存到数据库中。为了摆脱那个警告,你可能需要处理 IPython 的内部。

一般来说,当使用已知日期时间时,我强烈建议使用 pytz


我认为老实说最好的选择就是这个,也就是“接受它”。 - Carl Meyer

-3

修改settings.py文件,将USE_TZ设置为False即可解决此问题。


1
是的,但我希望使用时区支持 :) - frnhr
7
这并不能解决问题,只是通过停用 Django 的有用且重要的时区设置来规避它。自版本1.4以来,不建议使用naive datetimes。如果可以的话,请始终使用aware datetimes。这将在以后避免许多问题。此外,这个警告消息不会以任何方式影响IPython的行为,因此停用时区支持是没有意义的。 - pemistahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接