summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Godwin <andrew@aeracode.org>2013-07-02 12:06:00 +0100
committerAndrew Godwin <andrew@aeracode.org>2013-07-02 12:06:00 +0100
commitdbd3e775c1d2209d2b35cb1fa4b82e20b18c99d7 (patch)
tree7e77903536e045aed55d5eae03ebb1bbf72a9bad
parent9ef715d256938bd5d2c95a88ce0479aa5e493981 (diff)
Fix get_constraints to do multi-column indexes properly on pg
-rw-r--r--django/db/backends/postgresql_psycopg2/introspection.py27
1 files changed, 16 insertions, 11 deletions
diff --git a/django/db/backends/postgresql_psycopg2/introspection.py b/django/db/backends/postgresql_psycopg2/introspection.py
index c4974b89ca..ec953285ad 100644
--- a/django/db/backends/postgresql_psycopg2/introspection.py
+++ b/django/db/backends/postgresql_psycopg2/introspection.py
@@ -177,26 +177,31 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
constraints[constraint]['columns'].add(column)
# Now get indexes
cursor.execute("""
- SELECT c2.relname, attr.attname, idx.indkey, idx.indisunique, idx.indisprimary
+ SELECT
+ c2.relname,
+ ARRAY(
+ SELECT attr.attname
+ FROM unnest(idx.indkey) i, pg_catalog.pg_attribute attr
+ WHERE
+ attr.attnum = i AND
+ attr.attrelid = c.oid
+ ),
+ idx.indisunique,
+ idx.indisprimary
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
- pg_catalog.pg_index idx, pg_catalog.pg_attribute attr
+ pg_catalog.pg_index idx
WHERE c.oid = idx.indrelid
AND idx.indexrelid = c2.oid
- AND attr.attrelid = c.oid
- AND attr.attnum = idx.indkey[0]
AND c.relname = %s
""", [table_name])
- for index, column, coli, unique, primary in cursor.fetchall():
- # If we're the first column, make the record
+ for index, columns, unique, primary in cursor.fetchall():
if index not in constraints:
constraints[index] = {
- "columns": set(),
- "primary_key": False,
- "unique": False,
+ "columns": set(columns),
+ "primary_key": primary,
+ "unique": unique,
"foreign_key": False,
"check": False,
"index": True,
}
- # Record the details
- constraints[index]['columns'].add(column)
return constraints