Fixed #34070 -- Added subsecond support to Now() on SQLite and MySQL.

This commit is contained in:
Lily Foote 2022-09-25 13:32:05 +01:00 committed by Mariusz Felisiak
parent f71b0cf769
commit 649b28eab6
5 changed files with 39 additions and 2 deletions

View File

@ -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):

View File

@ -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

View File

@ -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``
--------- ---------

View File

@ -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
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~

View File

@ -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}}}")