Kaydet (Commit) b008f7cc authored tarafından Tim Graham's avatar Tim Graham

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

üst a7214f0e
...@@ -6,6 +6,7 @@ from MySQLdb.constants import FIELD_TYPE ...@@ -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): ...@@ -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():
......
...@@ -274,7 +274,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): ...@@ -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)
......
...@@ -3,6 +3,7 @@ import warnings ...@@ -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): ...@@ -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,
} }
......
...@@ -4,6 +4,7 @@ import warnings ...@@ -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): ...@@ -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)
......
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): ...@@ -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):
......
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'])
......
...@@ -9,6 +9,9 @@ from .models import CharFieldModel, IntegerArrayModel ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment