]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Add reflection of PostgreSQL index storage options
authorPete Hollobon <phollobon@renshawbay.com>
Thu, 4 Jun 2015 14:12:09 +0000 (15:12 +0100)
committerPete Hollobon <phollobon@renshawbay.com>
Thu, 4 Jun 2015 14:12:09 +0000 (15:12 +0100)
lib/sqlalchemy/dialects/postgresql/base.py
test/dialect/postgresql/test_reflection.py

index e0926a852cae2078d17faba4297a09c125655aac..b9690e21403015482f4f4ceaccab53e586c34f0d 100644 (file)
@@ -2624,7 +2624,8 @@ class PGDialect(default.DefaultDialect):
               SELECT
                   i.relname as relname,
                   ix.indisunique, ix.indexprs, ix.indpred,
-                  a.attname, a.attnum, NULL, ix.indkey%s
+                  a.attname, a.attnum, NULL, ix.indkey%s,
+                  i.reloptions
               FROM
                   pg_class t
                         join pg_index ix on t.oid = ix.indrelid
@@ -2651,7 +2652,8 @@ class PGDialect(default.DefaultDialect):
               SELECT
                   i.relname as relname,
                   ix.indisunique, ix.indexprs, ix.indpred,
-                  a.attname, a.attnum, c.conrelid, ix.indkey::varchar
+                  a.attname, a.attnum, c.conrelid, ix.indkey::varchar,
+                  i.reloptions
               FROM
                   pg_class t
                         join pg_index ix on t.oid = ix.indrelid
@@ -2680,7 +2682,7 @@ class PGDialect(default.DefaultDialect):
 
         sv_idx_name = None
         for row in c.fetchall():
-            idx_name, unique, expr, prd, col, col_num, conrelid, idx_key = row
+            idx_name, unique, expr, prd, col, col_num, conrelid, idx_key, options = row
 
             if expr:
                 if idx_name != sv_idx_name:
@@ -2706,6 +2708,8 @@ class PGDialect(default.DefaultDialect):
                 index['unique'] = unique
                 if conrelid is not None:
                     index['duplicates_constraint'] = idx_name
+                if options:
+                    index['options'] = dict([option.split("=") for option in options])
 
         result = []
         for name, idx in indexes.items():
@@ -2716,6 +2720,8 @@ class PGDialect(default.DefaultDialect):
             }
             if 'duplicates_constraint' in idx:
                 entry['duplicates_constraint'] = idx['duplicates_constraint']
+            if 'options' in idx:
+                entry.setdefault('dialect_options', {})["postgresql_with"] = idx['options']
             result.append(entry)
         return result
 
index 0ebe68cba040c37bbeacb8d6b027eef9c3579e64..70b81219eddefaf840478229c52aea4efff692f7 100644 (file)
@@ -672,6 +672,26 @@ class ReflectionTest(fixtures.TestBase):
         eq_(ind, [{'unique': False, 'column_names': ['y'], 'name': 'idx1'}])
         conn.close()
 
+    @testing.provide_metadata
+    def test_index_reflection_with_storage_options(self):
+        """reflect indexes with storage options set"""
+
+        metadata = self.metadata
+
+        t1 = Table('t', metadata,
+                   Column('id', Integer, primary_key=True),
+                   Column('x', Integer)
+                   )
+        metadata.create_all()
+        conn = testing.db.connect().execution_options(autocommit=True)
+        conn.execute("CREATE INDEX idx1 ON t (x) WITH (fillfactor = 50)")
+
+        ind = testing.db.dialect.get_indexes(conn, "t", None)
+        eq_(ind, [{'unique': False, 'column_names': ['x'], 'name': 'idx1',
+                   'dialect_options': {"postgresql_with": {"fillfactor": "50"}}}])
+        conn.close()
+
+
     @testing.provide_metadata
     def test_foreign_key_option_inspection(self):
         metadata = self.metadata