{{ lead.title }}
+{{ lead.body }}
+{{ lead.code }}
+ // live proof
+No install needed — the real engine runs in your browser.
++ See it on sample tables → + · + Open the full playground → +
+Start building safe, parameterized SQL for MySQL and PostgreSQL in minutes.
+npm install pagi-help
+ Get Started →
+ // what it does
+{{ lead.body }}
+{{ lead.code }}
+ {{ c.body }}
+
+ Existing require("pagi-help") code keeps working
+ unchanged. Move to the current API —
+ require("pagi-help/v2") — for PostgreSQL, cursor
+ pagination, and aggregate counts.
+
| + | + + {{ c.name }} + {{ c.key }} + + {{ c.type }} + | +
|---|---|
| {{ i + 1 }} | ++ {{ display(c, row).text }} + | +
| + | {{ emptyText }} | +
// one request, two dialects
+{{ t.t }}
+ {{ t.t }}
+ // pagination query builder
++ One small helper turns a request object into safe, parameterized SQL + for MySQL and PostgreSQL — filters, + search, sorting, unions, and cursor pagination included. +
+ + + +{{ tok.t }}
+
+ {{ tok.t }}▮
+ // how it works
+{{ s.body }}
+No filters.
+No sort.
+{{ result.query }}
+ {{ result.countQuery }}
+ {{ replacementsText }}
+
+ Edit the request (and the options) as JSON,
+ hit Run query, and see the SQL PagiHelp generates and the
+ rows + total count it returns — against the single products
+ table below. Invalid input shows the exact error, so this doubles as a quick
+ request validator.
+
⚠ Couldn’t parse options: {{ optionsError }}
+Edit which columns are selected or searched, then Run query.
+⚠ Couldn’t parse the request: {{ parseError }}
+Top-level filters are AND-ed; a nested array becomes an OR group. Ctrl+Enter to run.
{{ t.t }}
+ {{ t.t }}
+ {{ replacementsText }}
+
+
+ Values are always parameterized — every ? maps to an entry in
+ the replacements array, never string-concatenated. The
+ countQuery returns the total count, and PagiHelp
+ appends the primary key to ORDER BY as a tiebreaker for
+ deterministic paging.
+