diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-12-23 04:47:52 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-12-23 04:47:52 +0000 |
commit | 864644bee4e3acc5c63eac6e639ae39d1c3c8393 (patch) | |
tree | c29617f0eafe9050423a1b8b253b2e30c8ee903f /lib/sqlalchemy/databases/postgres.py | |
parent | 5b09d8179e6bd329829f7c196cb7c05f8fca20bd (diff) | |
download | sqlalchemy-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.py | 38 |
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 = """ |