mirror of
https://github.com/django/django.git
synced 2025-11-07 07:15:35 +00:00
Made get_indexes() consistent across backends.
Fixed #15933, #18082 -- the get_indexes() method introspection was done inconsitently depending on the backend. For example SQLite included all the columns in the table in the returned dictionary, while MySQL introspected also multicolumn indexes. All backends return now consistenly only single-column indexes. Thanks to andi for the MySQL report, and ikelly for comments on Oracle's get_indexes() changes.
This commit is contained in:
@@ -133,28 +133,22 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
|
||||
return key_columns
|
||||
|
||||
def get_indexes(self, cursor, table_name):
|
||||
"""
|
||||
Returns a dictionary of fieldname -> infodict for the given table,
|
||||
where each infodict is in the format:
|
||||
{'primary_key': boolean representing whether it's the primary key,
|
||||
'unique': boolean representing whether it's a unique index}
|
||||
"""
|
||||
indexes = {}
|
||||
for info in self._table_info(cursor, table_name):
|
||||
indexes[info['name']] = {'primary_key': info['pk'] != 0,
|
||||
'unique': False}
|
||||
if info['pk'] != 0:
|
||||
indexes[info['name']] = {'primary_key': True,
|
||||
'unique': False}
|
||||
cursor.execute('PRAGMA index_list(%s)' % self.connection.ops.quote_name(table_name))
|
||||
# seq, name, unique
|
||||
for index, unique in [(field[1], field[2]) for field in cursor.fetchall()]:
|
||||
if not unique:
|
||||
continue
|
||||
cursor.execute('PRAGMA index_info(%s)' % self.connection.ops.quote_name(index))
|
||||
info = cursor.fetchall()
|
||||
# Skip indexes across multiple fields
|
||||
if len(info) != 1:
|
||||
continue
|
||||
name = info[0][2] # seqno, cid, name
|
||||
indexes[name]['unique'] = True
|
||||
indexes[name] = {'primary_key': False,
|
||||
'unique': unique}
|
||||
return indexes
|
||||
|
||||
def get_primary_key_column(self, cursor, table_name):
|
||||
|
||||
Reference in New Issue
Block a user