Fixed #34070 -- Added subsecond support to Now() on SQLite and MySQL.
This commit is contained in:
parent
f71b0cf769
commit
649b28eab6
|
@ -81,7 +81,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
||||||
"swedish_ci": f"{charset}_swedish_ci",
|
"swedish_ci": f"{charset}_swedish_ci",
|
||||||
}
|
}
|
||||||
|
|
||||||
test_now_utc_template = "UTC_TIMESTAMP"
|
test_now_utc_template = "UTC_TIMESTAMP(6)"
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def django_test_skips(self):
|
def django_test_skips(self):
|
||||||
|
|
|
@ -223,6 +223,19 @@ class Now(Func):
|
||||||
compiler, connection, template="STATEMENT_TIMESTAMP()", **extra_context
|
compiler, connection, template="STATEMENT_TIMESTAMP()", **extra_context
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def as_mysql(self, compiler, connection, **extra_context):
|
||||||
|
return self.as_sql(
|
||||||
|
compiler, connection, template="CURRENT_TIMESTAMP(6)", **extra_context
|
||||||
|
)
|
||||||
|
|
||||||
|
def as_sqlite(self, compiler, connection, **extra_context):
|
||||||
|
return self.as_sql(
|
||||||
|
compiler,
|
||||||
|
connection,
|
||||||
|
template="STRFTIME('%%Y-%%m-%%d %%H:%%M:%%f', 'NOW')",
|
||||||
|
**extra_context,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TruncBase(TimezoneMixin, Transform):
|
class TruncBase(TimezoneMixin, Transform):
|
||||||
kind = None
|
kind = None
|
||||||
|
|
|
@ -495,6 +495,11 @@ Usage example::
|
||||||
``Now()`` uses ``STATEMENT_TIMESTAMP`` instead. If you need the transaction
|
``Now()`` uses ``STATEMENT_TIMESTAMP`` instead. If you need the transaction
|
||||||
timestamp, use :class:`django.contrib.postgres.functions.TransactionNow`.
|
timestamp, use :class:`django.contrib.postgres.functions.TransactionNow`.
|
||||||
|
|
||||||
|
.. versionchanged:: 4.2
|
||||||
|
|
||||||
|
Support for microsecond precision on MySQL and millisecond precision on
|
||||||
|
SQLite were added.
|
||||||
|
|
||||||
``Trunc``
|
``Trunc``
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
|
|
@ -223,6 +223,9 @@ Models
|
||||||
the text value of a key, index, or path transform of
|
the text value of a key, index, or path transform of
|
||||||
:class:`~django.db.models.JSONField`.
|
:class:`~django.db.models.JSONField`.
|
||||||
|
|
||||||
|
* :class:`~django.db.models.functions.Now` now supports microsecond precision
|
||||||
|
on MySQL and millisecond precision on SQLite.
|
||||||
|
|
||||||
Requests and Responses
|
Requests and Responses
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from django.db.models.functions import Now
|
from django.db import connection
|
||||||
|
from django.db.models import TextField
|
||||||
|
from django.db.models.functions import Cast, Now
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
|
@ -47,3 +49,17 @@ class NowTests(TestCase):
|
||||||
["How to Time Travel"],
|
["How to Time Travel"],
|
||||||
lambda a: a.title,
|
lambda a: a.title,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_microseconds(self):
|
||||||
|
Article.objects.create(
|
||||||
|
title="How to Django",
|
||||||
|
text=lorem_ipsum,
|
||||||
|
written=timezone.now(),
|
||||||
|
)
|
||||||
|
now_string = (
|
||||||
|
Article.objects.annotate(now_string=Cast(Now(), TextField()))
|
||||||
|
.get()
|
||||||
|
.now_string
|
||||||
|
)
|
||||||
|
precision = connection.features.time_cast_precision
|
||||||
|
self.assertRegex(now_string, rf"^.*\.\d{{1,{precision}}}")
|
||||||
|
|
Loading…
Reference in New Issue