1
0
mirror of https://github.com/django/django.git synced 2025-10-24 14:16:09 +00:00

Implemented get_indexes() for Postgres backend, which means 'inspectdb' can introspect primary keys and unique indexes for Postgres now.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@2349 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty
2006-02-18 22:04:52 +00:00
parent 5710c6e2db
commit 64153ef4d5
2 changed files with 29 additions and 2 deletions

View File

@@ -127,7 +127,34 @@ def get_relations(cursor, table_name):
return relations
def get_indexes(cursor, table_name):
raise NotImplementedError
"""
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}
"""
# Get the table description because we only have the column indexes, and we
# need the column names.
desc = get_table_description(cursor, table_name)
# This query retrieves each index on the given table.
cursor.execute("""
SELECT idx.indkey, idx.indisunique, idx.indisprimary
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
pg_catalog.pg_index idx
WHERE c.oid = idx.indrelid
AND idx.indexrelid = c2.oid
AND c.relname = %s""", [table_name])
indexes = {}
for row in cursor.fetchall():
# row[0] (idx.indkey) is stored in the DB as an array. It comes out as
# a string of space-separated integers. This designates the field
# indexes (1-based) of the fields that have indexes on the table.
# Here, we skip any indexes across multiple fields.
if ' ' in row[0]:
continue
col_name = desc[int(row[0])-1][0]
indexes[col_name] = {'primary_key': row[2], 'unique': row[1]}
return indexes
# Register these custom typecasts, because Django expects dates/times to be
# in Python's native (standard-library) datetime/time format, whereas psycopg