]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Public inspector method to load enum list
authorIlya Pekelny <ipekelny@mirantis.com>
Thu, 24 Jul 2014 16:27:18 +0000 (19:27 +0300)
committerIlya Pekelny <ipekelny@mirantis.com>
Fri, 8 Aug 2014 07:05:30 +0000 (10:05 +0300)
Provide opportunity to get enums list via an inspector instance public
interface.

lib/sqlalchemy/dialects/postgresql/base.py
test/dialect/postgresql/test_reflection.py

index 5ff2f7c6121d992e6be37e3c1e7ff38ee44427ea..3356e9d4b8d2f1d1581eaf2aca9c3c7a0dbf1fb6 100644 (file)
@@ -1574,6 +1574,12 @@ class PGInspector(reflection.Inspector):
 
         return self.dialect.get_table_oid(self.bind, table_name, schema,
                                           info_cache=self.info_cache)
+    def load_enums(self, conn, schema=None):
+        """Return a enums list.
+
+        A per-database and per-schema enums list."""
+        schema = schema or self.default_schema_name
+        return self.dialect._load_enums(conn, schema)
 
 
 class CreateEnumType(schema._CreateDropBase):
@@ -2424,7 +2430,8 @@ class PGDialect(default.DefaultDialect):
             for name, uc in uniques.items()
         ]
 
-    def _load_enums(self, connection):
+    def _load_enums(self, connection, schema=None):
+        schema = schema or self.default_schema_name
         if not self.supports_native_enum:
             return {}
 
@@ -2440,8 +2447,9 @@ class PGDialect(default.DefaultDialect):
                  LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
                  LEFT JOIN pg_catalog.pg_enum e ON t.oid = e.enumtypid
             WHERE t.typtype = 'e'
+            AND n.nspname = '%s'
             ORDER BY "name", e.oid -- e.oid gives us label order
-        """
+        """ % schema
 
         s = sql.text(SQL_ENUMS, typemap={
             'attname': sqltypes.Unicode,
index 1d6a4176563116dcb730ce847371f1a8ac410df1..26de239026b449af032cc5ba74b48a4eddf6ecf4 100644 (file)
@@ -1,5 +1,6 @@
 # coding: utf-8
 
+from sqlalchemy.engine import reflection
 from sqlalchemy.testing.assertions import eq_, assert_raises, \
     AssertsExecutionResults
 from sqlalchemy.testing import fixtures
@@ -622,6 +623,26 @@ class ReflectionTest(fixtures.TestBase):
         for fk in fks:
             eq_(fk, fk_ref[fk['name']])
 
+    @testing.provide_metadata
+    def test_inspect_enums_custom_schema(self):
+        conn = testing.db.connect()
+        enum_type = postgresql.ENUM('sad', 'ok', 'happy', name='mood',
+            metadata=self.metadata, schema='test_schema')
+        enum_type.create(conn)
+        inspector = reflection.Inspector.from_engine(conn.engine)
+        eq_(inspector.load_enums(conn, 'test_schema'), {
+            u'test_schema.mood': {'labels': [u'sad', u'ok', u'happy']}})
+
+    @testing.provide_metadata
+    def test_inspect_enums_schema(self):
+        conn = testing.db.connect()
+        enum_type = postgresql.ENUM('cat', 'dog', 'rat', name='pet',
+            metadata=self.metadata)
+        enum_type.create(conn)
+        inspector = reflection.Inspector.from_engine(conn.engine)
+        eq_(inspector.load_enums(conn), {
+            u'pet': {'labels': [u'cat', u'dog', u'rat']}})
+
 
 class CustomTypeReflectionTest(fixtures.TestBase):