Re: Add psql command to list constraints - Mailing list pgsql-hackers

From Tatsuro Yamada
Subject Re: Add psql command to list constraints
Date
Msg-id c4d6f884-4099-fa45-1fdf-bbd8004d327c@nttcom.co.jp
Whole thread Raw
In response to Re: Add psql command to list constraints  (Justin Pryzby <pryzby@telsasoft.com>)
Responses Re: Add psql command to list constraints
Re: Add psql command to list constraints
List pgsql-hackers
Hi Justin,

Thanks for your comments and review!

> Maybe it ought to be possible to choose the type of constraints to show.
> Similar to how \dt shows tables and \di shows indexes and \dti shows
> tables+inds, you could run \dcoc for check constraints and \dcof for foreign
> keys.  But I think "\dco" is too long of a prefix...


Yeah, agreed.
I added a filter based on the type of constraints:
   - c for check
   - f for foreign key
   - p for primary key
   - t for trigger
   - u for unique
   - x for exclude c, f, p, u, t, and x.

The following is examples of \dcop, \dcof, and \dcopf.

========================================================================
postgres=# \dcop
                     List of constraints
  Schema |     Name     |        Definition        |  Table
--------+--------------+--------------------------+---------
  public | t03_pk1_pkey | PRIMARY KEY (product_no) | t03_pk1
  public | t04_fk_pkey  | PRIMARY KEY (order_id)   | t04_fk
(2 rows)

postgres=# \dcof
                                         List of constraints
  Schema |          Name          |                       Definition                        | Table
--------+------------------------+---------------------------------------------------------+--------
  public | t04_fk_product_no_fkey | FOREIGN KEY (product_no) REFERENCES t03_pk1(product_no) | t04_fk
(1 row)

postgres=# \dcopf
                                          List of constraints
  Schema |          Name          |                       Definition                        |  Table
--------+------------------------+---------------------------------------------------------+---------
  public | t03_pk1_pkey           | PRIMARY KEY (product_no)                                | t03_pk1
  public | t04_fk_pkey            | PRIMARY KEY (order_id)                                  | t04_fk
  public | t04_fk_product_no_fkey | FOREIGN KEY (product_no) REFERENCES t03_pk1(product_no) | t04_fk
(3 rows)
========================================================================


I too think \dco is a long name. So,  I'd like to get suggestions to be more shortened. :)


  
>> +    initPQExpBuffer(&buf);
>> +    printfPQExpBuffer(&buf,
>> +                      "SELECT \n"
>> +                      "n.nspname AS \"%s\", \n"
>> +                      "cst.conname AS \"%s\", \n"
>> +                      "pg_catalog.pg_get_constraintdef(cst.oid) AS \"%s\", \n"
>> +                      "c.relname AS \"%s\" \n"
>> +                      "FROM pg_constraint cst \n"
>> +                      "JOIN pg_namespace n ON n.oid = cst.connamespace \n"
>> +                      "JOIN pg_class c ON c.oid = cst.conrelid \n",
> 
> You should write "pg_catalog." prefix for the tables (in addition to the
> function).


Oops, You are right. Fixed.

  
> Rather than join to pg_class, you can write conrelid::pg_catalog.regclass,
> since regclass is supported since at least v7.3 (but ::regnamespace was
> introduced in v9.5, so the join against pg_namespace is still necessary).
> https://www.postgresql.org/docs/9.5/datatype-oid.html
>> +    myopt.title = _("List of constsraints");
> 
> spelling: constraints


Thanks! Fixed.

  
> I'm not confident that if I would use this, so let's wait to see if someone
> else wants to give a +1.


Okay, but you agree that there are DBAs and users who want to see the
list of constraints, I think.

Currently, DBAs need the table name to see the constraint information.
However, with this feature, you can see its definition and table name
from the constraint name.
For example, it will be easier to understand how many foreign key
constraints are in the DB. The \d command also displays the constraints
but does not list them, so this feature is more beneficial for those who
want to check them.


Attached new patch includes:

   -  Add a filter by contype
   - Add pg_catalog prefix
   - Fix typo
   - Fix help message to add \dco

Not implemented yet:
   - NOT NULL constraint, and so on (based on pg_attribute)
   - Tab completion
   - Regression test
   - Document

Any comments welcome! :-D


Thanks,
Tatsuro Yamada

Attachment

pgsql-hackers by date:

Previous
From: Mark Dilger
Date:
Subject: Add regression coverage for REVOKE ADMIN OPTION
Next
From: "houzj.fnst@fujitsu.com"
Date:
Subject: RE: pg_get_publication_tables() output duplicate relid