Simple RESTful interface to single PostgreSQL tables.
It's a simplistic URL-based data viewing and graphing tool that is easy to setup and use, reflecting table data in a REST-ful way. Only a single table's data is shown at one time. Idea also tries to minimize typing by providing some convenience features like matching of db/table names from partially inputted names + default sorting and limiting.
- Python2
- CherryPy web framework
- Jinja2 templating
- psycopg2 Postgresql driver
- Pygal for png graphing (optional)
- pyyaml for parsing the webapp's config file
- jQuery
- DataTables - jQuery plugin for sortable/searchable/pageable tables
- Flot Charts
- Bootstrap
/ somedb / sometable
/ somedb / sometable / somecolumn / comparison_operator / value
-
all URL segments of 3 [when 1st seg. not conflicting with a few reserved keywords ] are handled as filter
-
multiple filters possible
-
for date columns some special shortcuts can be used
- current_month (beginning date), current_week (beginning date), current_day/current_date, current_timestamp/now
- -/+X(days|hours|minutes|seconds) e.g. - / created / >= /-5days => WHERE order_created >= current_date - '5 days'::interval
/ somedb / sometable / l[imit] / value
/ somedb / sometable / o[rderby]
- 1st column will be used + default sort order from the config
/ somedb / sometable / o[rderby] / [ a[sc] | d[esc] ]
- 1st column with explicit ordering
/ somedb / sometable / o[rderby] / somecol / [ a[sc] | d[esc] ]
- single column ordering with explicit ordering
/ somedb / sometable / o[rderby] / somecol1[,somecol2,..]
- multicolumn ordering
/ somedb / sometable / agg / agg_func / somecol
- where agg_func in ['count', 'sum', 'min', 'max']
Line graph of single column's counts over time, with month to minute grouping ($graphbucket param). The $graphkey column needs to be of type date/timestamp!
/ somedb / sometable / f[ormat] / g[raph] / l[ine] / [ gk | graphkey] / temporal_col / [ gb | graphbucket ] / [month|day|hour|min|minute]
/ somedb / sometable / f[ormat] / g[raph] / p[pie] / [ gk | graphkey] / somecol
/ somedb / sometable / f[ormat] / g[raph] / p[pie] / [ gk | graphkey] / somecol / l[imit] / value
NB! For aggregates and graphs also filters can (and should) be used. For pie graphs "limit" also works.
- HTML table [ default ]
- JSON -
/ f[ormat] / j[son]
- CSV -
/ f[ormat] / c[sv]
- Graph - HTML + JS based -
/ f[ormat] / g[raph]
- Graph - pure PNG
/ f[ormat] / png
/somedb/tablename_excerpt
The simplest usecase. database/table names don't have to be precise, only excerpts will do, given they're precise enough to uniquely identify a table 1st matching column is used. as a wildcard '*' can be used
SELECT col1,colX,.. FROM schema.table_full_name LIMIT 20
/somedb/order/created/>/current_date
SELECT col1,colX,.. FROM schema.order_history WHERE oh_created > current_date LIMIT 10
Usage of filtering. All groups of 3 parameters [starting with non-reserved keywords] are handled as filters. Multiple filters possible.
NB! Currently filters are passed to the DB "as is" but SQL injection shouldn't still be possible due to countermeasures.
/somedb/order/created/>/current_date/o/c
SELECT col1,colX,.. FROM schema.order_history WHERE oh_created > current_date ORDER BY o_created DESC LIMIT 10
NB! "/o/c" i.e. "o[rderby] / [c[reated]|m[odified]]" is a Pgzebra concept of ordering by first column matching predefined [see pgzebra.yaml] created/modified patterns
Default "LIMIT" (here 10) comes also from the pgzebra.yaml
/somedb/order/created/>/current_date/orderby/created/l/10
SELECT col1,colX,.. FROM schema.order_history WHERE oh_created > current_date ORDER BY o_created DESC LIMIT 10
The same as previous in longer format + explicit "LIMIT". NB! Default "ORDER BY" direction is "DESC" - can be changed from config file
/somedb/order/o/a
SELECT o_id,colX,.. FROM schema.order_history ORDER BY o_id ASC LIMIT 10
Simple select with ascending primary key ordering [given that PK is the 1st columns]
/somedb/order/agg/count/id/created/>/current_date
SELECT count(o_id) FROM schema.order_history WHERE oh_created > current_date
Simple aggregates support is provided. Multiple aggregates can be used in one query.
- count
- sum
- min
- max
/somedb/order/f/g/line/gk/created/gb/month/created/>/current_date
SELECT date_trunc('month', oh_created), count(*) FROM order_history WHERE oh_created > current_date GROUP BY 1 ORDER BY 1
Displays a "line graph" of counts of "graphkey" over timeslots specified by "graphbucket" column. Filtering is possible as usual.
NB! Missing buckets will be filled with 0-s.
/somedb/order/f/g/pie/gk/country/created/>/current_date
SELECT oh_country, count(*) FROM order_history WHERE oh_created > current_date GROUP BY 1 ORDER BY 2 DESC LIMIT 10
NB! Displays a "pie graph" of $graphkey's distribution. Values not fitting into "limit" will be summarized into "Other".