summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2016-06-06 17:29:33 -0400
committerGerrit Code Review <gerrit2@ln3.zzzcomputing.com>2016-06-06 17:29:33 -0400
commit6bc0da30b0f238514ccfbc8ac1fb78200ee104d1 (patch)
treea832d3757466657b7038c09e328ec97c4616a2e6
parent2860ae6c4927dbbca9316c81ce15cbbb7df49750 (diff)
parentec2004d8c278b3aefd32c8743fe5c4d4a6c40bd4 (diff)
downloadsqlalchemy-6bc0da30b0f238514ccfbc8ac1fb78200ee104d1.tar.gz
Merge "Refine PG inspection methods"
-rw-r--r--lib/sqlalchemy/dialects/postgresql/base.py128
1 files changed, 34 insertions, 94 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py
index e25ec9aea..2356458b9 100644
--- a/lib/sqlalchemy/dialects/postgresql/base.py
+++ b/lib/sqlalchemy/dialects/postgresql/base.py
@@ -1925,114 +1925,54 @@ class PGDialect(default.DefaultDialect):
@reflection.cache
def get_schema_names(self, connection, **kw):
- s = """
- SELECT nspname
- FROM pg_namespace
- ORDER BY nspname
- """
- rp = connection.execute(s)
- # what about system tables?
-
- if util.py2k:
- schema_names = [row[0].decode(self.encoding) for row in rp
- if not row[0].startswith('pg_')]
- else:
- schema_names = [row[0] for row in rp
- if not row[0].startswith('pg_')]
- return schema_names
+ result = connection.execute(
+ sql.text("SELECT nspname FROM pg_namespace "
+ "WHERE nspname NOT LIKE 'pg_%' "
+ "ORDER BY nspname"
+ ).columns(nspname=sqltypes.Unicode))
+ return [name for name, in result]
@reflection.cache
def get_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 = 'r' "
- "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]
+ sql.text("SELECT c.relname FROM pg_class c "
+ "JOIN pg_namespace n ON n.oid = c.relnamespace "
+ "WHERE n.nspname = :schema AND c.relkind = 'r'"
+ ).columns(relname=sqltypes.Unicode),
+ schema=schema if schema is not None else self.default_schema_name)
+ return [name for name, in result]
@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]
+ sql.text("SELECT c.relname FROM pg_class c "
+ "JOIN pg_namespace n ON n.oid = c.relnamespace "
+ "WHERE n.nspname = :schema AND c.relkind = 'f'"
+ ).columns(relname=sqltypes.Unicode),
+ schema=schema if schema is not None else self.default_schema_name)
+ return [name for name, in result]
@reflection.cache
def get_view_names(self, connection, schema=None, **kw):
- if schema is not None:
- current_schema = schema
- else:
- current_schema = self.default_schema_name
- s = """
- SELECT relname
- FROM pg_class c
- WHERE relkind IN ('m', 'v')
- AND '%(schema)s' = (select nspname from pg_namespace n
- where n.oid = c.relnamespace)
- """ % dict(schema=current_schema)
-
- if util.py2k:
- view_names = [row[0].decode(self.encoding)
- for row in connection.execute(s)]
- else:
- view_names = [row[0] for row in connection.execute(s)]
- return view_names
+ result = connection.execute(
+ sql.text("SELECT c.relname FROM pg_class c "
+ "JOIN pg_namespace n ON n.oid = c.relnamespace "
+ "WHERE n.nspname = :schema AND c.relkind IN ('v', 'm')"
+ ).columns(relname=sqltypes.Unicode),
+ schema=schema if schema is not None else self.default_schema_name)
+ return [name for name, in result]
@reflection.cache
def get_view_definition(self, connection, view_name, schema=None, **kw):
- if schema is not None:
- current_schema = schema
- else:
- current_schema = self.default_schema_name
-
- if self.server_version_info >= (9, 3):
- s = """
- SELECT definition FROM pg_views
- WHERE schemaname = :schema
- AND viewname = :view_name
-
- UNION
-
- SELECT definition FROM pg_matviews
- WHERE schemaname = :schema
- AND matviewname = :view_name
-
- """
- else:
- s = """
- SELECT definition FROM pg_views
- WHERE schemaname = :schema
- AND viewname = :view_name
- """
-
- rp = connection.execute(sql.text(s),
- view_name=view_name, schema=current_schema)
- if rp:
- if util.py2k:
- view_def = rp.scalar().decode(self.encoding)
- else:
- view_def = rp.scalar()
- return view_def
+ view_def = connection.scalar(
+ sql.text("SELECT pg_get_viewdef(c.oid) view_def FROM pg_class c "
+ "JOIN pg_namespace n ON n.oid = c.relnamespace "
+ "WHERE n.nspname = :schema AND c.relname = :view_name "
+ "AND c.relkind IN ('v', 'm')"
+ ).columns(view_def=sqltypes.Unicode),
+ schema=schema if schema is not None else self.default_schema_name,
+ view_name=view_name)
+ return view_def
@reflection.cache
def get_columns(self, connection, table_name, schema=None, **kw):