Author: cito
Date: Tue Jan 12 07:44:49 2016
New Revision: 720

Log:
Simplify queries by using alias names

Modified:
   trunk/pg.py

Modified: trunk/pg.py
==============================================================================
--- trunk/pg.py Tue Jan 12 07:27:13 2016        (r719)
+++ trunk/pg.py Tue Jan 12 07:44:49 2016        (r720)
@@ -586,19 +586,16 @@
         if qcl not in self._pkeys:
             # if not found, check again in case it was added after we started
             self._pkeys = {}
-            for r in self.db.query(
-                "SELECT pg_namespace.nspname, pg_class.relname,"
-                    " pg_attribute.attname FROM pg_class"
-                " JOIN pg_namespace"
-                    " ON pg_namespace.oid = pg_class.relnamespace"
-                    " AND pg_namespace.nspname"
-                    " NOT SIMILAR TO 'pg/_%|information/_schema' ESCAPE '/'"
-                " JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid"
-                    " AND NOT pg_attribute.attisdropped"
-                " JOIN pg_index ON pg_index.indrelid = pg_class.oid"
-                    " AND pg_index.indisprimary"
-                    " AND pg_attribute.attnum"
-                        " = ANY (pg_index.indkey)").getresult():
+            q = ("SELECT s.nspname, r.relname, a.attname"
+                " FROM pg_class r"
+                " JOIN pg_namespace s ON s.oid = r.relnamespace"
+                " AND s.nspname NOT SIMILAR"
+                " TO 'pg/_%|information/_schema' ESCAPE '/'"
+                " JOIN pg_attribute a ON a.attrelid = r.oid"
+                " AND NOT a.attisdropped"
+                " JOIN pg_index i ON i.indrelid = r.oid"
+                " AND i.indisprimary AND a.attnum = ANY (i.indkey)")
+            for r in self.db.query(q).getresult():
                 cl, pkey = _join_parts(r[:2]), r[2]
                 self._pkeys.setdefault(cl, []).append(pkey)
             # (only) for composite primary keys, the values will be frozensets
@@ -622,14 +619,14 @@
             specifying which kind of relations you want to list.
 
         """
-        where = "pg_class.relkind IN (%s) AND" % ','.join(
-            ["'%s'" % x for x in kinds]) if kinds else ''
-        return [_join_parts(x) for x in self.db.query(
-            "SELECT pg_namespace.nspname, pg_class.relname"
-            " FROM pg_class "
-            " JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace "
-            " WHERE %s pg_namespace.nspname"
-            " NOT SIMILAR TO 'pg/_%%|information/_schema' ESCAPE '/'"
+        where = " AND r.relkind IN (%s)" % ','.join(
+            ["'%s'" % k for k in kinds]) if kinds else ''
+        return [_join_parts(r) for r in self.db.query(
+            "SELECT s.nspname, r.relname"
+            " FROM pg_class r"
+            " JOIN pg_namespace s ON s.oid = r.relnamespace"
+            " WHERE s.nspname NOT SIMILAR"
+            " TO 'pg/_%%|information/_schema' ESCAPE '/' %s"
             " ORDER BY 1, 2" % where).getresult()]
 
     def get_tables(self):
@@ -661,16 +658,15 @@
         if qcl not in self.get_relations('rv'):
             raise _prg_error('Class %s does not exist' % qcl)
 
-        q = "SELECT pg_attribute.attname, pg_type.typname"
-        if self._regtypes:
-            q += "::regtype"
-        q += (" FROM pg_class"
-            " JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid"
-            " JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid"
-            " JOIN pg_type ON pg_type.oid = pg_attribute.atttypid"
-            " WHERE pg_namespace.nspname = '%s' AND pg_class.relname = '%s'"
-            " AND (pg_attribute.attnum > 0 OR pg_attribute.attname = 'oid')"
-            " AND NOT pg_attribute.attisdropped") % cl
+        q = ("SELECT a.attname, t.typname%s"
+            " FROM pg_class r"
+            " JOIN pg_namespace s ON r.relnamespace = s.oid"
+            " JOIN pg_attribute a ON a.attrelid = r.oid"
+            " JOIN pg_type t ON t.oid = a.atttypid"
+            " WHERE s.nspname = '%s' AND r.relname = '%s'"
+            " AND (a.attnum > 0 OR a.attname = 'oid')"
+            " AND NOT a.attisdropped") % (
+                '::regtype' if self._regtypes else '', cl[0], cl[1])
         q = self.db.query(q).getresult()
 
         if self._regtypes:
_______________________________________________
PyGreSQL mailing list
[email protected]
https://mail.vex.net/mailman/listinfo.cgi/pygresql

Reply via email to