summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/databases/postgres.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-12-23 04:47:52 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-12-23 04:47:52 +0000
commit864644bee4e3acc5c63eac6e639ae39d1c3c8393 (patch)
treec29617f0eafe9050423a1b8b253b2e30c8ee903f /lib/sqlalchemy/databases/postgres.py
parent5b09d8179e6bd329829f7c196cb7c05f8fca20bd (diff)
downloadsqlalchemy-864644bee4e3acc5c63eac6e639ae39d1c3c8393.tar.gz
- Added Index reflection support to Postgres, using a
great patch we long neglected, submitted by Ken Kuhlman. [ticket:714]
Diffstat (limited to 'lib/sqlalchemy/databases/postgres.py')
-rw-r--r--lib/sqlalchemy/databases/postgres.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py
index dd9fa5293..8ac9bfabf 100644
--- a/lib/sqlalchemy/databases/postgres.py
+++ b/lib/sqlalchemy/databases/postgres.py
@@ -619,6 +619,44 @@ class PGDialect(default.DefaultDialect):
table.append_constraint(schema.ForeignKeyConstraint(constrained_columns, refspec, conname))
+ # Indexes
+ IDX_SQL = """
+ SELECT c.relname, i.indisunique, i.indexprs, i.indpred,
+ a.attname
+ FROM pg_index i, pg_class c, pg_attribute a
+ WHERE i.indrelid = :table AND i.indexrelid = c.oid
+ AND a.attrelid = i.indexrelid AND i.indisprimary = 'f'
+ ORDER BY c.relname, a.attnum
+ """
+ t = sql.text(IDX_SQL, typemap={'attname':sqltypes.Unicode})
+ c = connection.execute(t, table=table_oid)
+ indexes = {}
+ sv_idx_name = None
+ for row in c.fetchall():
+ idx_name, unique, expr, prd, col = row
+
+ if expr and not idx_name == sv_idx_name:
+ util.warn(
+ "Skipped unsupported reflection of expression-based index %s"
+ % idx_name)
+ sv_idx_name = idx_name
+ continue
+ if prd and not idx_name == sv_idx_name:
+ util.warn(
+ "Predicate of partial index %s ignored during reflection"
+ % idx_name)
+ sv_idx_name = idx_name
+
+ if not indexes.has_key(idx_name):
+ indexes[idx_name] = [unique, []]
+ indexes[idx_name][1].append(col)
+
+ for name, (unique, columns) in indexes.items():
+ schema.Index(name, *[table.columns[c] for c in columns],
+ **dict(unique=unique))
+
+
+
def _load_domains(self, connection):
## Load data types for domains:
SQL_DOMAINS = """