summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Dufresne <jon.dufresne@gmail.com>2015-04-04 12:22:30 -0700
committerClaude Paroz <claude@2xlibre.net>2015-04-06 22:43:51 +0200
commit2cf58e80d1be46ae95f77c95fe014921742295dd (patch)
tree6f26f2fbeb8f330d495437f361682bd9eb1a9b03
parentad53213066ad25545959170f40322fa5b094989b (diff)
Fixed #24584 -- Fixed microsecond handling with older MySQLdb
-rw-r--r--django/db/backends/mysql/operations.py8
-rw-r--r--docs/releases/1.8.1.txt4
-rw-r--r--tests/basic/tests.py23
3 files changed, 30 insertions, 5 deletions
diff --git a/django/db/backends/mysql/operations.py b/django/db/backends/mysql/operations.py
index fd468cb182..bc53f59ec5 100644
--- a/django/db/backends/mysql/operations.py
+++ b/django/db/backends/mysql/operations.py
@@ -77,7 +77,10 @@ class DatabaseOperations(BaseDatabaseOperations):
timedelta.days, timedelta.seconds, timedelta.microseconds), []
def format_for_duration_arithmetic(self, sql):
- return 'INTERVAL %s MICROSECOND' % sql
+ if self.connection.features.supports_microsecond_precision:
+ return 'INTERVAL %s MICROSECOND' % sql
+ else:
+ return 'INTERVAL FLOOR(%s / 1000000) SECOND' % sql
def drop_foreignkey_sql(self):
return "DROP FOREIGN KEY"
@@ -146,6 +149,9 @@ class DatabaseOperations(BaseDatabaseOperations):
else:
raise ValueError("MySQL backend does not support timezone-aware datetimes when USE_TZ is False.")
+ if not self.connection.features.supports_microsecond_precision:
+ value = value.replace(microsecond=0)
+
return six.text_type(value)
def value_to_db_time(self, value):
diff --git a/docs/releases/1.8.1.txt b/docs/releases/1.8.1.txt
index 303a793be2..65d32f190c 100644
--- a/docs/releases/1.8.1.txt
+++ b/docs/releases/1.8.1.txt
@@ -21,3 +21,7 @@ Bugfixes
* Fixed :djadmin:`squashmigrations` command when using
:class:`~django.db.migrations.operations.SeparateDatabaseAndState`
(:ticket:`24278`).
+
+* Stripped microseconds from ``datetime`` values when using an older version of
+ the MySQLdb DB API driver as it does not support fractional seconds
+ (:ticket:`24584`).
diff --git a/tests/basic/tests.py b/tests/basic/tests.py
index d2a96799cf..0fd673fca6 100644
--- a/tests/basic/tests.py
+++ b/tests/basic/tests.py
@@ -192,15 +192,30 @@ class ModelTest(TestCase):
@skipIfDBFeature('supports_microsecond_precision')
def test_microsecond_precision_not_supported(self):
- # In MySQL, microsecond-level precision isn't available. You'll lose
- # microsecond-level precision once the data is saved.
+ # In MySQL, microsecond-level precision isn't always available. You'll
+ # lose microsecond-level precision once the data is saved.
a9 = Article(
headline='Article 9',
pub_date=datetime(2005, 7, 31, 12, 30, 45, 180),
)
a9.save()
- self.assertEqual(Article.objects.get(id__exact=a9.id).pub_date,
- datetime(2005, 7, 31, 12, 30, 45))
+ self.assertEqual(
+ Article.objects.get(id__exact=a9.id).pub_date,
+ datetime(2005, 7, 31, 12, 30, 45),
+ )
+
+ @skipIfDBFeature('supports_microsecond_precision')
+ def test_microsecond_precision_not_supported_edge_case(self):
+ # In MySQL, microsecond-level precision isn't always available. You'll
+ # lose microsecond-level precision once the data is saved.
+ a = Article.objects.create(
+ headline='Article',
+ pub_date=datetime(2008, 12, 31, 23, 59, 59, 999999),
+ )
+ self.assertEqual(
+ Article.objects.get(pk=a.pk).pub_date,
+ datetime(2008, 12, 31, 23, 59, 59),
+ )
def test_manually_specify_primary_key(self):
# You can manually specify the primary key when creating a new object.