From: Mike Bayer Date: Fri, 19 Jun 2015 18:10:47 +0000 (-0400) Subject: - for #3455 X-Git-Tag: rel_1_0_6~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e625d2ea88f4ae3e0a667b3d2a904dafbd0421b9;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - for #3455 - changelog - versionadded + reflink for new pg storage parameters doc - pep8ing - add additional tests to definitely check that the Index object is created all the way with the opts we want fixes #3455 --- diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index a02a13ef90..efb5187163 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -18,6 +18,23 @@ .. changelog:: :version: 1.0.6 + .. change:: + :tags: feature, postgresql + :tickets: 3455 + :pullreq: github:179 + + Added support for storage parameters under CREATE INDEX, using + a new keyword argument ``postgresql_with``. Also added support for + reflection to support both the ``postgresql_with`` flag as well + as the ``postgresql_using`` flag, which will now be set on + :class:`.Index` objects that are reflected, as well present + in a new "dialect_options" dictionary in the result of + :meth:`.Inspector.get_indexes`. Pull request courtesy Pete Hollobon. + + .. seealso:: + + :ref:`postgresql_index_storage` + .. change:: :tags: bug, orm :tickets: 3462 diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index b46c653352..22c66dbbb4 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -401,6 +401,8 @@ The value passed to the keyword argument will be simply passed through to the underlying CREATE INDEX command, so it *must* be a valid index type for your version of PostgreSQL. +.. _postgresql_index_storage: + Index Storage Parameters ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -411,6 +413,8 @@ keyword argument:: Index('my_index', my_table.c.data, postgresql_with={"fillfactor": 50}) +.. versionadded:: 1.0.6 + .. _postgresql_index_concurrently: Indexes with CONCURRENTLY @@ -2690,7 +2694,8 @@ class PGDialect(default.DefaultDialect): sv_idx_name = None for row in c.fetchall(): - idx_name, unique, expr, prd, col, col_num, conrelid, idx_key, options, amname = row + (idx_name, unique, expr, prd, col, + col_num, conrelid, idx_key, options, amname) = row if expr: if idx_name != sv_idx_name: @@ -2717,7 +2722,13 @@ class PGDialect(default.DefaultDialect): if conrelid is not None: index['duplicates_constraint'] = idx_name if options: - index['options'] = dict([option.split("=") for option in options]) + index['options'] = dict( + [option.split("=") for option in options]) + + # it *might* be nice to include that this is 'btree' in the + # reflection info. But we don't want an Index object + # to have a ``postgresql_using`` in it that is just the + # default, so for the moment leaving this out. if amname and amname != 'btree': index['amname'] = amname @@ -2731,9 +2742,11 @@ 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'] + entry.setdefault( + 'dialect_options', {})["postgresql_with"] = idx['options'] if 'amname' in idx: - entry.setdefault('dialect_options', {})["postgresql_using"] = idx['amname'] + entry.setdefault( + 'dialect_options', {})["postgresql_using"] = idx['amname'] result.append(entry) return result diff --git a/test/dialect/postgresql/test_compiler.py b/test/dialect/postgresql/test_compiler.py index 7311416042..9fa5c98043 100644 --- a/test/dialect/postgresql/test_compiler.py +++ b/test/dialect/postgresql/test_compiler.py @@ -375,24 +375,22 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): tbl = Table('testtbl', m, Column('data', String)) idx1 = Index('test_idx1', tbl.c.data) - idx2 = Index('test_idx2', tbl.c.data, postgresql_with={"fillfactor": 50}) + idx2 = Index( + 'test_idx2', tbl.c.data, postgresql_with={"fillfactor": 50}) idx3 = Index('test_idx3', tbl.c.data, postgresql_using="gist", postgresql_with={"buffering": "off"}) self.assert_compile(schema.CreateIndex(idx1), 'CREATE INDEX test_idx1 ON testtbl ' - '(data)', - dialect=postgresql.dialect()) + '(data)') self.assert_compile(schema.CreateIndex(idx2), 'CREATE INDEX test_idx2 ON testtbl ' '(data) ' - 'WITH (fillfactor = 50)', - dialect=postgresql.dialect()) + 'WITH (fillfactor = 50)') self.assert_compile(schema.CreateIndex(idx3), 'CREATE INDEX test_idx3 ON testtbl ' 'USING gist (data) ' - 'WITH (buffering = off)', - dialect=postgresql.dialect()) + 'WITH (buffering = off)') def test_create_index_expr_gets_parens(self): m = MetaData() diff --git a/test/dialect/postgresql/test_reflection.py b/test/dialect/postgresql/test_reflection.py index ed8a88fd44..e72ddadad1 100644 --- a/test/dialect/postgresql/test_reflection.py +++ b/test/dialect/postgresql/test_reflection.py @@ -679,18 +679,27 @@ class ReflectionTest(fixtures.TestBase): metadata = self.metadata - t1 = Table('t', metadata, - Column('id', Integer, primary_key=True), - Column('x', Integer) - ) + 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() + with testing.db.connect().execution_options(autocommit=True) as conn: + 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"}}}]) + + m = MetaData() + t1 = Table('t', m, autoload_with=conn) + eq_( + list(t1.indexes)[0].dialect_options['postgresql']['with'], + {"fillfactor": "50"} + ) @testing.provide_metadata def test_index_reflection_with_access_method(self): @@ -698,18 +707,24 @@ class ReflectionTest(fixtures.TestBase): metadata = self.metadata - t1 = Table('t', metadata, - Column('id', Integer, primary_key=True), - Column('x', ARRAY(Integer)) - ) + Table( + 't', metadata, + Column('id', Integer, primary_key=True), + Column('x', ARRAY(Integer)) + ) metadata.create_all() - conn = testing.db.connect().execution_options(autocommit=True) - conn.execute("CREATE INDEX idx1 ON t USING gin (x)") - - ind = testing.db.dialect.get_indexes(conn, "t", None) - eq_(ind, [{'unique': False, 'column_names': ['x'], 'name': 'idx1', - 'dialect_options': {'postgresql_using': 'gin'}}]) - conn.close() + with testing.db.connect().execution_options(autocommit=True) as conn: + conn.execute("CREATE INDEX idx1 ON t USING gin (x)") + + ind = testing.db.dialect.get_indexes(conn, "t", None) + eq_(ind, [{'unique': False, 'column_names': ['x'], 'name': 'idx1', + 'dialect_options': {'postgresql_using': 'gin'}}]) + m = MetaData() + t1 = Table('t', m, autoload_with=conn) + eq_( + list(t1.indexes)[0].dialect_options['postgresql']['using'], + 'gin' + ) @testing.provide_metadata def test_foreign_key_option_inspection(self):