mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #34070 -- Added subsecond support to Now() on SQLite and MySQL.
This commit is contained in:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							f71b0cf769
						
					
				
				
					commit
					649b28eab6
				
			| @@ -81,7 +81,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): | ||||
|             "swedish_ci": f"{charset}_swedish_ci", | ||||
|         } | ||||
|  | ||||
|     test_now_utc_template = "UTC_TIMESTAMP" | ||||
|     test_now_utc_template = "UTC_TIMESTAMP(6)" | ||||
|  | ||||
|     @cached_property | ||||
|     def django_test_skips(self): | ||||
|   | ||||
| @@ -223,6 +223,19 @@ class Now(Func): | ||||
|             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): | ||||
|     kind = None | ||||
|   | ||||
| @@ -495,6 +495,11 @@ Usage example:: | ||||
|     ``Now()`` uses ``STATEMENT_TIMESTAMP`` instead. If you need the transaction | ||||
|     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`` | ||||
| --------- | ||||
|  | ||||
|   | ||||
| @@ -223,6 +223,9 @@ Models | ||||
|   the text value of a key, index, or path transform of | ||||
|   :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 | ||||
| ~~~~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| 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.utils import timezone | ||||
|  | ||||
| @@ -47,3 +49,17 @@ class NowTests(TestCase): | ||||
|             ["How to Time Travel"], | ||||
|             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}}}") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user