7

好的,当我运行功能测试时出现奇怪的时区问题。Django 1.4,Python 2.7。MySQL 上的 DateTimeField() 中的毫秒数是否被截断?这是我唯一的理论。

模型文件

from django.db import models
from django.utils import timezone

class Search(models.Model):
    query = models.CharField(max_length=200, null=True)
    query_date = models.DateTimeField(null=True)

测试.py

from django.test import TestCase
from django.utils import timezone
from search.models import Search

class SearchModelTest(TestCase):
def test_creating_a_new_search_and_saving_it_to_the_database(self):
    # start by creating a new Poll object with its "question" set
    search = Search()
    search.query = "Test"
    search.query_date = timezone.now()

    # check we can save it to the database
    search.save()

    # now check we can find it in the database again
    all_search_in_database = Search.objects.all()
    self.assertEquals(len(all_search_in_database), 1)
    only_search_in_database = all_search_in_database[0]
    self.assertEquals(only_search_in_database, search)

    # and check that it's saved its two attributes: question and pub_date
    self.assertEquals(only_search_in_database.query, "Test")
    self.assertEquals(only_search_in_database.query_date, search.query_date)

测试失败了:

self.assertEquals(only_search_in_database.query_date, search.query_date)
AssertionError: datetime.datetime(2013, 1, 16, 21, 12, 35, tzinfo=<UTC>) != datetime.datetime(2013, 1, 16, 21, 12, 35, 234108, tzinfo=<UTC>)

我认为发生的事情是毫秒在保存到数据库后被截断。可以这样吗?我正在运行 MySQL v 5.5。MySQL是否截断日期?

4

4 回答 4

11

Django ORM在 mysql 中转换DateTimeField为。Timestamp您可以通过查看原始 sql 来确认./manage.py sqlall <appname>

在 mysqltimestamp中不存储毫秒。

The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.

这是 MySql 中的一个错误,似乎已在 v5.6.4 中修复,错误

Noted in 5.6.4 changelog.

MySQL now supports fractional seconds for TIME, DATETIME, and
TIMESTAMP values, with up to microsecond precision.
于 2013-01-16T21:43:14.233 回答
5

Django 1.8 现在支持毫秒

以前,Django 在使用 MySQL 后端时会从日期时间和时间值中截断小数秒。现在它让数据库决定是否应该删除该部分值

于 2015-04-17T13:27:28.370 回答
2

根据mysql开发者网站

DATETIME 或 TIMESTAMP 值可以包括以微秒(6 位)精度为单位的尾随小数秒部分。尽管可以识别此小数部分,但它会从存储到 DATETIME 或 TIMESTAMP 列中的值中丢弃。

于 2013-01-16T21:39:38.487 回答
-2

更新:这真的是老答案,不再相关。

DJango ORM 还不支持 MySQL 的微秒。他们故意截断微秒部分。如果您使用的是 MySQL 5.6.4 或更高版本,您可以对 DJango 代码应用以下更改以使其按预期工作:

这是一个 3 行更改。希望 Django 开发人员包括它。你可以在这里关注票:https ://code.djangoproject.com/ticket/19716


在“db/backends/mysql/base.py”中

函数“def value_to_db_datetime(self, value)”

更改自:

return six.text_type(value.replace(microseconds=0))

至:

return six.text_type(value)

在“db/backends/mysql/base.py”函数中“def value_to_db_time(self, value)”

更改自:

return six.text_type(value.replace(microseconds=0))

至:

return six.text_type(value)

在“db/backends/mysql/creation.py”中定义“data_types”

更改自:

'DateTimeField': 'datetime',

至:

'DateTimeField': 'datetime(6)',
于 2013-07-23T11:56:24.143 回答