Commit 2cf58e80 authored by Jon Dufresne's avatar Jon Dufresne Committed by Claude Paroz
Browse files

Fixed #24584 -- Fixed microsecond handling with older MySQLdb

parent ad532130
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -77,7 +77,10 @@ class DatabaseOperations(BaseDatabaseOperations):
            timedelta.days, timedelta.seconds, timedelta.microseconds), []

    def format_for_duration_arithmetic(self, 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):
+4 −0
Original line number Diff line number Diff line
@@ -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`).
+19 −4
Original line number Diff line number Diff line
@@ -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.