Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Implemented get_indexes() for Postgres backend, which means 'inspectd…

…b' 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
  • Loading branch information...
commit 64153ef4d5ecd838c61eaa785e79856469afa83b 1 parent 5710c6e
@adrianholovaty adrianholovaty authored
Showing with 29 additions and 2 deletions.
  1. +28 −1 django/core/db/backends/postgresql.py
  2. +1 −1  docs/django-admin.txt
View
29 django/core/db/backends/postgresql.py
@@ -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
View
2  docs/django-admin.txt
@@ -117,7 +117,7 @@ models that refer to other models are ordered properly.
If you're using Django 0.90 or 0.91, you'll need to add ``primary_key=True`` to
one field in each model. In the Django development version, primary keys are
-automatically introspected for MySQL, and Django puts in the
+automatically introspected for PostgreSQL and MySQL, and Django puts in the
``primary_key=True`` where needed.
``inspectdb`` works with PostgreSQL, MySQL and SQLite. Foreign-key detection
Please sign in to comment.
Something went wrong with that request. Please try again.