mirror of https://github.com/django/django.git
Refs #28459 -- Improved performance of duration expressions on SQLite.
This commit is contained in:
parent
8e1a7dab4b
commit
2115be616b
|
@ -1,6 +1,7 @@
|
||||||
"""
|
"""
|
||||||
SQLite3 backend for the sqlite3 module in the standard library.
|
SQLite3 backend for the sqlite3 module in the standard library.
|
||||||
"""
|
"""
|
||||||
|
import datetime
|
||||||
import decimal
|
import decimal
|
||||||
import math
|
import math
|
||||||
import re
|
import re
|
||||||
|
@ -14,7 +15,7 @@ from django.db import utils
|
||||||
from django.db.backends import utils as backend_utils
|
from django.db.backends import utils as backend_utils
|
||||||
from django.db.backends.base.base import BaseDatabaseWrapper
|
from django.db.backends.base.base import BaseDatabaseWrapper
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.dateparse import parse_datetime, parse_duration, parse_time
|
from django.utils.dateparse import parse_datetime, parse_time
|
||||||
from django.utils.duration import duration_microseconds
|
from django.utils.duration import duration_microseconds
|
||||||
|
|
||||||
from .client import DatabaseClient # isort:skip
|
from .client import DatabaseClient # isort:skip
|
||||||
|
@ -426,20 +427,11 @@ def _sqlite_format_dtdelta(conn, lhs, rhs):
|
||||||
"""
|
"""
|
||||||
LHS and RHS can be either:
|
LHS and RHS can be either:
|
||||||
- An integer number of microseconds
|
- An integer number of microseconds
|
||||||
- A string representing a timedelta object
|
|
||||||
- A string representing a datetime
|
- A string representing a datetime
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
if isinstance(lhs, int):
|
real_lhs = datetime.timedelta(0, 0, lhs) if isinstance(lhs, int) else backend_utils.typecast_timestamp(lhs)
|
||||||
lhs = str(decimal.Decimal(lhs) / decimal.Decimal(1000000))
|
real_rhs = datetime.timedelta(0, 0, rhs) if isinstance(rhs, int) else backend_utils.typecast_timestamp(rhs)
|
||||||
real_lhs = parse_duration(lhs)
|
|
||||||
if real_lhs is None:
|
|
||||||
real_lhs = backend_utils.typecast_timestamp(lhs)
|
|
||||||
if isinstance(rhs, int):
|
|
||||||
rhs = str(decimal.Decimal(rhs) / decimal.Decimal(1000000))
|
|
||||||
real_rhs = parse_duration(rhs)
|
|
||||||
if real_rhs is None:
|
|
||||||
real_rhs = backend_utils.typecast_timestamp(rhs)
|
|
||||||
if conn.strip() == '+':
|
if conn.strip() == '+':
|
||||||
out = real_lhs + real_rhs
|
out = real_lhs + real_rhs
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -10,7 +10,7 @@ from django.db.models import aggregates, fields
|
||||||
from django.db.models.expressions import Col
|
from django.db.models.expressions import Col
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.dateparse import parse_date, parse_datetime, parse_time
|
from django.utils.dateparse import parse_date, parse_datetime, parse_time
|
||||||
from django.utils.duration import duration_string
|
from django.utils.duration import duration_microseconds
|
||||||
|
|
||||||
|
|
||||||
class DatabaseOperations(BaseDatabaseOperations):
|
class DatabaseOperations(BaseDatabaseOperations):
|
||||||
|
@ -63,7 +63,7 @@ class DatabaseOperations(BaseDatabaseOperations):
|
||||||
return "django_date_extract('%s', %s)" % (lookup_type.lower(), field_name)
|
return "django_date_extract('%s', %s)" % (lookup_type.lower(), field_name)
|
||||||
|
|
||||||
def date_interval_sql(self, timedelta):
|
def date_interval_sql(self, timedelta):
|
||||||
return "'%s'" % duration_string(timedelta)
|
return str(duration_microseconds(timedelta))
|
||||||
|
|
||||||
def format_for_duration_arithmetic(self, sql):
|
def format_for_duration_arithmetic(self, sql):
|
||||||
"""Do nothing since formatting is handled in the custom function."""
|
"""Do nothing since formatting is handled in the custom function."""
|
||||||
|
|
Loading…
Reference in New Issue