Starting from PostgreSQL 10, PostgreSQL introduced the declarative partitioning syntax. With this syntax the necessity to define additional triggers or rules disappear, but functionality and performances remain unchanged.
It's possible to use declarative partitioning for list partitioning and/or for range partitioning; first of all, we have to define a master table containing the partition method (list or RANGE). For example, if we want to partition by a list method:
create table orders_state (orderid integer not null, orderdate date not null, customerid integer not null, tax numeric(12,2) not null , state char(2)) partition by list (state);
Next, we have to create the child table, for example, for all US orders:
CREATE TABLE ORDERS_US PARTITION OF ORDERS_state FOR...