Fixed #15170 -- Skip the inspectdb test under MySQL/MyISAM, because it can't differentiate a foreign key from an integer.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15385 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2011-02-01 14:42:52 +00:00
parent 76fb2bb0e2
commit 74d485c4ec
3 changed files with 24 additions and 1 deletions

View File

@ -168,6 +168,7 @@ class BaseDatabaseFeatures(object):
_confirmed = False _confirmed = False
supports_transactions = None supports_transactions = None
supports_stddev = None supports_stddev = None
can_introspect_foreign_keys = None
def __init__(self, connection): def __init__(self, connection):
self.connection = connection self.connection = connection
@ -177,6 +178,7 @@ class BaseDatabaseFeatures(object):
self._confirmed = True self._confirmed = True
self.supports_transactions = self._supports_transactions() self.supports_transactions = self._supports_transactions()
self.supports_stddev = self._supports_stddev() self.supports_stddev = self._supports_stddev()
self.can_introspect_foreign_keys = self._can_introspect_foreign_keys()
def _supports_transactions(self): def _supports_transactions(self):
"Confirm support for transactions" "Confirm support for transactions"
@ -201,6 +203,12 @@ class BaseDatabaseFeatures(object):
except NotImplementedError: except NotImplementedError:
self.supports_stddev = False self.supports_stddev = False
def _can_introspect_foreign_keys(self):
"Confirm support for introspected foreign keys"
# Every database can do this reliably, except MySQL,
# which can't do it for MyISAM tables
return True
class BaseDatabaseOperations(object): class BaseDatabaseOperations(object):
""" """

View File

@ -133,6 +133,19 @@ class DatabaseFeatures(BaseDatabaseFeatures):
requires_explicit_null_ordering_when_grouping = True requires_explicit_null_ordering_when_grouping = True
allows_primary_key_0 = False allows_primary_key_0 = False
def _can_introspect_foreign_keys(self):
"Confirm support for introspected foreign keys"
cursor = self.connection.cursor()
cursor.execute('CREATE TABLE INTROSPECT_TEST (X INT)')
# This command is MySQL specific; the second column
# will tell you the default table type of the created
# table. Since all Django's test tables will have the same
# table type, that's enough to evaluate the feature.
cursor.execute('SHOW TABLE STATUS WHERE Name="INTROSPECT_TEST"')
result = cursor.fetchone()
cursor.execute('DROP TABLE INTROSPECT_TEST')
return result[1] != 'MyISAM'
class DatabaseOperations(BaseDatabaseOperations): class DatabaseOperations(BaseDatabaseOperations):
compiler_module = "django.db.backends.mysql.compiler" compiler_module = "django.db.backends.mysql.compiler"

View File

@ -1,10 +1,12 @@
from StringIO import StringIO from StringIO import StringIO
from django.core.management import call_command from django.core.management import call_command
from django.test import TestCase from django.test import TestCase, skipUnlessDBFeature
class InspectDBTestCase(TestCase): class InspectDBTestCase(TestCase):
@skipUnlessDBFeature('can_introspect_foreign_keys')
def test_attribute_name_not_python_keyword(self): def test_attribute_name_not_python_keyword(self):
out = StringIO() out = StringIO()
call_command('inspectdb', stdout=out) call_command('inspectdb', stdout=out)