From 6e4e0f4ce48b80495e89abbee030cf49809a9c54 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 29 Sep 2016 21:05:35 +0200 Subject: [PATCH] Fixed #26541 -- Allowed MySQL transaction detection to work without table creation. --- django/db/backends/mysql/features.py | 7 +++++++ tests/backends/test_features.py | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py index 991a064cee..f8c0ddea00 100644 --- a/django/db/backends/mysql/features.py +++ b/django/db/backends/mysql/features.py @@ -78,3 +78,10 @@ class DatabaseFeatures(BaseDatabaseFeatures): cursor.execute('SELECT @@SQL_AUTO_IS_NULL') result = cursor.fetchone() return result and result[0] == 1 + + @cached_property + def supports_transactions(self): + """ + All storage engines except MyISAM support transactions. + """ + return self._mysql_storage_engine != 'MyISAM' diff --git a/tests/backends/test_features.py b/tests/backends/test_features.py index 831a0002a3..e7cb3dbfe8 100644 --- a/tests/backends/test_features.py +++ b/tests/backends/test_features.py @@ -1,8 +1,25 @@ +from unittest import skipUnless + from django.db import connection -from django.test import TestCase +from django.test import TestCase, mock class TestDatabaseFeatures(TestCase): def test_nonexistent_feature(self): self.assertFalse(hasattr(connection.features, 'nonexistent')) + + +@skipUnless(connection.vendor == 'mysql', 'MySQL backend tests') +class TestMySQLFeatures(TestCase): + + def test_mysql_supports_transactions(self): + """ + All storage engines except MyISAM support transactions. + """ + with mock.patch('django.db.connection.features._mysql_storage_engine', 'InnoDB'): + self.assertTrue(connection.features.supports_transactions) + del connection.features.supports_transactions + with mock.patch('django.db.connection.features._mysql_storage_engine', 'MyISAM'): + self.assertFalse(connection.features.supports_transactions) + del connection.features.supports_transactions