| id | customer_id | total |
|---|---|---|
| 1041 | 17 | 120.00 |
| 1042 | 23 | 48.50 |
| 1043 | 31 | 75.00 |
- customers.id
- 23
- name
- Example Bakery
- orders@example.com
- city
- Leeds
Follow a foreign key
Click customer_id and the customer opens beside the order.
A database client that stages every edit as SQL you review.
status = 'pending'Sort by created| id | customer | total | status | created |
|---|---|---|---|---|
| 1041 | Example Kitchen | 120.00 | pending | 09:12 |
| 1042 | Example Bakery | 48.50 | 09:40 | |
| 1043 | Example Florist | 75.00 | pending | 10:05 |
| 1044 | Example Kitchen | 32.00 | pending | 10:31 |
| 1045 | Example Cafe | 210.00 | pending | 11:02 |
| 1046 | Example Florist | pending | 11:47 |
shop=> SELECT * FROM orders WHERE status = 'pending' ORDER BY created_at;
id | customer | total | status | created_at
------+-----------------+--------+---------+------------------
1041 | Example Kitchen | 120.00 | pending | 2026-10-19 09:12
1042 | Example Bakery | 48.50 | pending | 2026-10-19 09:40
1043 | Example Florist | 75.00 | pending | 2026-10-19 10:05
1044 | Example Kitchen | 32.00 | pending | 2026-10-19 10:31
1045 | Example Cafe | 210.00 | pending | 2026-10-19 11:02
1046 | Example Florist | 64.00 | pending | 2026-10-19 11:47
(6 rows)
shop=> UPDATE orders SET status = 'shipped' WHERE id = 1042;
UPDATE 1
shop=> -- no review, already written
UPDATE orders SET status = 'shipped' WHERE id = 1042;
2 changes staged
Review SQL
Rows, schema, JSON and keys share one screen.
| id | customer_id | total |
|---|---|---|
| 1041 | 17 | 120.00 |
| 1042 | 23 | 48.50 |
| 1043 | 31 | 75.00 |
Click customer_id and the customer opens beside the order.
products.attributes, row 8
{
"colour": "oat",
"sizes": ["S", "M", "L"],
"care": {
"wash": 30,
"tumble": false
}
}
Fold, search and edit nested values in place.
Tables, filters and exports, a few letters away.
| id | bigint | primary key |
| customer_id | bigint | references customers |
| total | numeric(10,2) | not null |
| status | text | default 'pending' |
Types, keys and defaults sit beside the rows they shape.
Paste the connection URL from your app’s config.
New connection
postgres://app@db.example.com:5432/shopClick a column to sort it; type to filter.
| id | name | city | orders | |
|---|---|---|---|---|
| 23 | Example Bakery | orders@example.com | Leeds | 14 |
| 17 | Example Kitchen | hello@example.com | Leeds | 9 |
| 40 | Example Market | shop@example.com | Leeds | 3 |
| 52 | Example Studio | studio@example.com | Leeds | 1 |
leeds-pending.sql
1SELECT c.name, count(o.id) AS pending
2FROM orders o
3JOIN customers c ON c.id = o.customer_id
4WHERE o.status = 'pending'
5 AND c.city = 'Leeds'
6GROUP BY c.name
7ORDER BY pending DESC;
nametext, customersnotestext, customersFor the joins and counts a filter cannot reach.
psql writes on Enter. Rowan waits for you.
psql, already written
shop=> UPDATE orders SET status = 'shipped'
WHERE id = 1042;
UPDATE 1
shop=> UPDATE orders SET total = 60.00
WHERE id = 1046;
UPDATE 1
Rowan, commit.sql, waiting for review
BEGIN;
UPDATE orders SET status = 'shipped' WHERE id = 1042;
UPDATE orders SET total = 60.00 WHERE id = 1046;
COMMIT;
One email, with the installer and nothing else.