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:
parent
5710c6e2db
commit
64153ef4d5
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue