7

OK、関数テストを実行しているときに奇妙なタイムゾーンの問題が発生します。Django 1.4、Python2.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)

test.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>)

データベースに保存した後、ミリ秒が切り捨てられていることが起こっていると思います。それは正しいでしょうか?MySQLv5.5を実行しています。MySQLは日付を切り捨てていますか?

4

4 に答える 4

11

DjangoORMは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のTheBugで修正されているようです

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

Django1.8はミリ秒をサポートするようになりました。

以前は、MySQLバックエンドを使用すると、Djangoは日時と時刻の値から秒の小数部を切り捨てていました。これで、データベースが値のその部分を削除するかどうかを決定できるようになります

于 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」内

関数"defvalue_to_db_datetime(self、value)"

から変更する:

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

に:

return six.text_type(value)

「db/backends / mysql /base.py」関数「defvalue_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 に答える