This is a complete rewrite to better support all the features that I was trying to get into v2. There are a few breaking changes from v2 beta , which some (myself included) are using in production, so I'm skipping a stable v2 release and going to v3.
Here are some of the new things available..
- Converted to ESM with CJS support
- Deno support
- Dynamic query builder based on raw sql
- Realtime subscribe to db changes through logical replication
- Cursors as async iterators
- Multi-host support for High Availability setups
- Postgres input parameter types from
ParameterDescription
.describe()
to only get query input types and column definitions- Support for Large Objects
- max_lifetime for connections
- Cancellation of requests
Breaking changes from v2 -> v3
- Cursors are always called with
Result
arrays (previously cursor 1 would return a row object, where > 1 would return an array of rows) .writable()
and.readable()
is now async (returns a Promise that resolves to the stream)- Queries now returns a lazy promise instead of being executed immediately. This means the query won't be sent until awaited (.then, .catch, .finally is called) or until
.execute()
is manually called. .stream()
is renamed to.forEach
- Returned results are now it's own
Result
class extendingArray
instead of an Array with extra properties (actually shouldn't be breaking unless you're doing something funny) - Parameters are now cast using the types returned from Postgres ParameterDescription with a fallback to the previously inferred types
- Only tested with node v12 and up
- Implicit array value to multiple parameter expansion removed (use sql([...]) instead)
Breaking changes from v1 -> v2 (v2 never moved on from beta)
- All identifiers from
sql()
in queries are now always quoted - Undefined parameters are no longer allowed
- Numbers that cannot be safely cast to JS Number are returned as string. This happens for eg,
select count(*)
becausecount()
returns a 64 bit integer (int8), so if you know yourcount()
won't be too big for a js number just cast in your query to int4 likeselect count(*)::int