From fbd2d70a5cfd7b5c219c51cb5b7866c4ab89cece Mon Sep 17 00:00:00 2001 From: Rodrigo Menezes Date: Wed, 3 Sep 2014 16:38:43 -0400 Subject: [PATCH] Fixing some pep8s and adding get_foreign_tables. --- lib/sqlalchemy/dialects/postgresql/base.py | 22 ++++++++++++++++++++-- lib/sqlalchemy/engine/interfaces.py | 6 ++++++ test/dialect/postgresql/test_reflection.py | 17 +++++++++++------ test/requirements.py | 2 +- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index 40b2f60ae9..69ae6cfed3 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -2086,7 +2086,7 @@ class PGDialect(default.DefaultDialect): s = """ SELECT relname FROM pg_class c - WHERE relkind = 'v' + WHERE relkind IN ('m', v') AND '%(schema)s' = (select nspname from pg_namespace n where n.oid = c.relnamespace) """ % dict(schema=current_schema) @@ -2098,6 +2098,24 @@ class PGDialect(default.DefaultDialect): view_names = [row[0] for row in connection.execute(s)] return view_names + @reflection.cache + def get_foreign_table_names(self, connection, schema=None, **kw): + if schema is not None: + current_schema = schema + else: + current_schema = self.default_schema_name + + result = connection.execute( + sql.text("SELECT relname FROM pg_class c " + "WHERE relkind = 'f' " + "AND '%s' = (select nspname from pg_namespace n " + "where n.oid = c.relnamespace) " % + current_schema, + typemap={'relname': sqltypes.Unicode} + ) + ) + return [row[0] for row in result] + @reflection.cache def get_view_definition(self, connection, view_name, schema=None, **kw): if schema is not None: @@ -2434,7 +2452,7 @@ class PGDialect(default.DefaultDialect): # cast indkey as varchar since it's an int2vector, # returned as a list by some drivers such as pypostgresql - + IDX_SQL = """ SELECT i.relname as relname, diff --git a/lib/sqlalchemy/engine/interfaces.py b/lib/sqlalchemy/engine/interfaces.py index 71df29cac1..e1e346850f 100644 --- a/lib/sqlalchemy/engine/interfaces.py +++ b/lib/sqlalchemy/engine/interfaces.py @@ -319,6 +319,12 @@ class Dialect(object): raise NotImplementedError() + def get_foreign_tables(self, connection, view_name, schema=None, **kw): + """Return a list of foreign table names for `schema`.""" + """ + + raise NotImplementedError() + def get_view_definition(self, connection, view_name, schema=None, **kw): """Return view definition. diff --git a/test/dialect/postgresql/test_reflection.py b/test/dialect/postgresql/test_reflection.py index 405ac5921e..567aec927a 100644 --- a/test/dialect/postgresql/test_reflection.py +++ b/test/dialect/postgresql/test_reflection.py @@ -13,7 +13,7 @@ import sqlalchemy as sa from sqlalchemy.dialects.postgresql import base as postgresql -class AlternateRelkindReflectionTest(fixtures.TestBase, AssertsExecutionResults): +class AltRelkindReflectionTest(fixtures.TestBase, AssertsExecutionResults): """Test reflection on materialized views and foreign tables""" __requires__ = 'postgresql_test_dblink', @@ -23,7 +23,8 @@ class AlternateRelkindReflectionTest(fixtures.TestBase, AssertsExecutionResults) @classmethod def setup_class(cls): from sqlalchemy.testing import config - cls.dblink = config.file_config.get('sqla_testing', 'postgres_test_db_link') + cls.dblink = config.file_config.get('sqla_testing', + 'postgres_test_db_link') metadata = MetaData(testing.db) testtable = Table( @@ -39,8 +40,10 @@ class AlternateRelkindReflectionTest(fixtures.TestBase, AssertsExecutionResults) for ddl in \ "CREATE MATERIALIZED VIEW test_mview AS SELECT * FROM testtable;", \ - "CREATE SERVER test_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (dbname 'test', host '%s');" % cls.dblink, \ - "CREATE USER MAPPING FOR public SERVER test_server options (user 'scott', password 'tiger');", \ + "CREATE SERVER test_server FOREIGN DATA WRAPPER postgres_fdw \ + OPTIONS (dbname 'test', host '%s');" % cls.dblink, \ + "CREATE USER MAPPING FOR public \ + SERVER test_server options (user 'scott', password 'tiger');", \ "CREATE FOREIGN TABLE test_foreigntable ( \ id INT, \ data VARCHAR(30) \ @@ -63,7 +66,8 @@ class AlternateRelkindReflectionTest(fixtures.TestBase, AssertsExecutionResults) def test_mview_is_reflected(self): metadata = MetaData(testing.db) table = Table('test_mview', metadata, autoload=True) - eq_(set(table.columns.keys()), set(['id', 'data']), "Columns of reflected mview didn't equal expected columns") + eq_(set(table.columns.keys()), set(['id', 'data']), + "Columns of reflected mview didn't equal expected columns") def test_mview_select(self): metadata = MetaData(testing.db) @@ -75,7 +79,8 @@ class AlternateRelkindReflectionTest(fixtures.TestBase, AssertsExecutionResults) def test_foreign_table_is_reflected(self): metadata = MetaData(testing.db) table = Table('test_foreigntable', metadata, autoload=True) - eq_(set(table.columns.keys()), set(['id', 'data']), "Columns of reflected foreign table didn't equal expected columns") + eq_(set(table.columns.keys()), set(['id', 'data']), + "Columns of reflected foreign table didn't equal expected columns") def test_foreign_table_select(self): metadata = MetaData(testing.db) diff --git a/test/requirements.py b/test/requirements.py index 46c19389a8..14bb256912 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -712,7 +712,7 @@ class DefaultRequirements(SuiteRequirements): 'sqla_testing', 'postgres_test_db_link'), "postgres_test_db_link option not specified in config" ) - + @property def percent_schema_names(self): return skip_if( -- 2.47.3