Fixed #27135 -- Made index introspection return Index.suffix.

This commit is contained in:
Tim Graham 2017-02-15 13:33:55 -05:00
parent a7214f0e84
commit b008f7cc56
7 changed files with 22 additions and 9 deletions

View File

@ -6,6 +6,7 @@ from MySQLdb.constants import FIELD_TYPE
from django.db.backends.base.introspection import ( from django.db.backends.base.introspection import (
BaseDatabaseIntrospection, FieldInfo, TableInfo, BaseDatabaseIntrospection, FieldInfo, TableInfo,
) )
from django.db.models.indexes import Index
from django.utils.datastructures import OrderedSet from django.utils.datastructures import OrderedSet
from django.utils.deprecation import RemovedInDjango21Warning from django.utils.deprecation import RemovedInDjango21Warning
from django.utils.encoding import force_text from django.utils.encoding import force_text
@ -217,7 +218,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
'foreign_key': None, 'foreign_key': None,
} }
constraints[index]['index'] = True constraints[index]['index'] = True
constraints[index]['type'] = type_.lower() constraints[index]['type'] = Index.suffix if type_ == 'BTREE' else type_.lower()
constraints[index]['columns'].add(column) constraints[index]['columns'].add(column)
# Convert the sorted sets to lists # Convert the sorted sets to lists
for constraint in constraints.values(): for constraint in constraints.values():

View File

@ -274,7 +274,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
"foreign_key": None, "foreign_key": None,
"check": False, "check": False,
"index": True, "index": True,
"type": 'btree' if type_ == 'normal' else type_, "type": 'idx' if type_ == 'normal' else type_,
} }
# Record the details # Record the details
constraints[constraint]['columns'].append(column) constraints[constraint]['columns'].append(column)

View File

@ -3,6 +3,7 @@ import warnings
from django.db.backends.base.introspection import ( from django.db.backends.base.introspection import (
BaseDatabaseIntrospection, FieldInfo, TableInfo, BaseDatabaseIntrospection, FieldInfo, TableInfo,
) )
from django.db.models.indexes import Index
from django.utils.deprecation import RemovedInDjango21Warning from django.utils.deprecation import RemovedInDjango21Warning
from django.utils.encoding import force_text from django.utils.encoding import force_text
@ -234,7 +235,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
"foreign_key": None, "foreign_key": None,
"check": False, "check": False,
"index": True, "index": True,
"type": type_, "type": Index.suffix if type_ == 'btree' else type_,
"definition": definition, "definition": definition,
"options": options, "options": options,
} }

View File

@ -4,6 +4,7 @@ import warnings
from django.db.backends.base.introspection import ( from django.db.backends.base.introspection import (
BaseDatabaseIntrospection, FieldInfo, TableInfo, BaseDatabaseIntrospection, FieldInfo, TableInfo,
) )
from django.db.models.indexes import Index
from django.utils.deprecation import RemovedInDjango21Warning from django.utils.deprecation import RemovedInDjango21Warning
field_size_re = re.compile(r'^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$') field_size_re = re.compile(r'^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$')
@ -262,7 +263,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
# Add type and column orders for indexes # Add type and column orders for indexes
if constraints[index]['index'] and not constraints[index]['unique']: if constraints[index]['index'] and not constraints[index]['unique']:
# SQLite doesn't support any index type other than b-tree # SQLite doesn't support any index type other than b-tree
constraints[index]['type'] = 'btree' constraints[index]['type'] = Index.suffix
cursor.execute( cursor.execute(
"SELECT sql FROM sqlite_master " "SELECT sql FROM sqlite_master "
"WHERE type='index' AND name=%s" % self.connection.ops.quote_name(index) "WHERE type='index' AND name=%s" % self.connection.ops.quote_name(index)

View File

@ -1,6 +1,7 @@
from unittest import mock, skipUnless from unittest import mock, skipUnless
from django.db import connection from django.db import connection
from django.db.models import Index
from django.db.utils import DatabaseError from django.db.utils import DatabaseError
from django.test import TransactionTestCase, skipUnlessDBFeature from django.test import TransactionTestCase, skipUnlessDBFeature
from django.test.utils import ignore_warnings from django.test.utils import ignore_warnings
@ -191,7 +192,7 @@ class IntrospectionTests(TransactionTestCase):
for key, val in constraints.items(): for key, val in constraints.items():
if val['columns'] == ['headline', 'pub_date']: if val['columns'] == ['headline', 'pub_date']:
index = val index = val
self.assertEqual(index['type'], 'btree') self.assertEqual(index['type'], Index.suffix)
@skipUnlessDBFeature('supports_index_column_ordering') @skipUnlessDBFeature('supports_index_column_ordering')
def test_get_constraints_indexes_orders(self): def test_get_constraints_indexes_orders(self):

View File

@ -1,10 +1,13 @@
from django.db import models from django.db import models
from django.test import TestCase from django.test import SimpleTestCase
from .models import Book from .models import Book
class IndexesTests(TestCase): class IndexesTests(SimpleTestCase):
def test_suffix(self):
self.assertEqual(models.Index.suffix, 'idx')
def test_repr(self): def test_repr(self):
index = models.Index(fields=['title']) index = models.Index(fields=['title'])

View File

@ -9,6 +9,9 @@ from .models import CharFieldModel, IntegerArrayModel
@skipUnlessDBFeature('has_brin_index_support') @skipUnlessDBFeature('has_brin_index_support')
class BrinIndexTests(PostgreSQLTestCase): class BrinIndexTests(PostgreSQLTestCase):
def test_suffix(self):
self.assertEqual(BrinIndex.suffix, 'brin')
def test_repr(self): def test_repr(self):
index = BrinIndex(fields=['title'], pages_per_range=4) index = BrinIndex(fields=['title'], pages_per_range=4)
another_index = BrinIndex(fields=['title']) another_index = BrinIndex(fields=['title'])
@ -41,6 +44,9 @@ class BrinIndexTests(PostgreSQLTestCase):
class GinIndexTests(PostgreSQLTestCase): class GinIndexTests(PostgreSQLTestCase):
def test_suffix(self):
self.assertEqual(GinIndex.suffix, 'gin')
def test_repr(self): def test_repr(self):
index = GinIndex(fields=['title']) index = GinIndex(fields=['title'])
self.assertEqual(repr(index), "<GinIndex: fields='title'>") self.assertEqual(repr(index), "<GinIndex: fields='title'>")
@ -84,7 +90,7 @@ class SchemaTests(PostgreSQLTestCase):
editor.add_index(IntegerArrayModel, index) editor.add_index(IntegerArrayModel, index)
constraints = self.get_constraints(IntegerArrayModel._meta.db_table) constraints = self.get_constraints(IntegerArrayModel._meta.db_table)
# Check gin index was added # Check gin index was added
self.assertEqual(constraints[index_name]['type'], 'gin') self.assertEqual(constraints[index_name]['type'], GinIndex.suffix)
# Drop the index # Drop the index
with connection.schema_editor() as editor: with connection.schema_editor() as editor:
editor.remove_index(IntegerArrayModel, index) editor.remove_index(IntegerArrayModel, index)
@ -97,7 +103,7 @@ class SchemaTests(PostgreSQLTestCase):
with connection.schema_editor() as editor: with connection.schema_editor() as editor:
editor.add_index(CharFieldModel, index) editor.add_index(CharFieldModel, index)
constraints = self.get_constraints(CharFieldModel._meta.db_table) constraints = self.get_constraints(CharFieldModel._meta.db_table)
self.assertEqual(constraints[index_name]['type'], 'brin') self.assertEqual(constraints[index_name]['type'], BrinIndex.suffix)
self.assertEqual(constraints[index_name]['options'], ['pages_per_range=4']) self.assertEqual(constraints[index_name]['options'], ['pages_per_range=4'])
with connection.schema_editor() as editor: with connection.schema_editor() as editor:
editor.remove_index(CharFieldModel, index) editor.remove_index(CharFieldModel, index)