Skip to content

Get off of slonik fork #1119

Open
Open
@lognaturel

Description

@lognaturel

We are currently using a fork of slonik: alxndrsn/slonik@b0299fa

This is because of some stream-related issues.

At least one related patch has been accepted to upstream node-postgres: brianc/node-postgres#2836

History of postgres clients used in Central:

  • Started out with knex: chaining based query builder but wasn’t great to work with
    • Streaming-related bugs
  • Swapped to slonik because it seemed closer to desired interface
    • Tests ran 30% slower than knex (not clear on production impact)
    • Experienced several streaming-related bugs
    • Single maintainer has come and gone in availability
  • July 2022, started considering postgres.js
    • Lots of energy behind it
    • Uses a similar tag template literal interface as Slonik
    • issa discovered after finished Slonik work
    • Would have switched to it, but at the time, it didn’t support composing SQL fragments ("partials"), now introduced
    • Transactions weren't initially working, at least in tests
    • Initial PR: remove slonik, insert postgres.js #564
    • Lots of tiny differences from Slonik. For the most part, it’s an improvement. A lot of things that we did by hand before, porsager postgres has an answer.
    • porsager postgres has some weird quirks of its own though, e.g., no join utilities.
    • So far it’s a code reduction. No queries so far have needed to change. Only core infrastructure has changed so far.
    • Streaming issues - Caught errors within transactions still thrown as uncaught porsager/postgres#455; would need to add support for multiple streams

A barrier to upgrading slonik has been several breaking changes since the version we were on. It seems there's likely a more deliberate approach to breaking changes now: gajus/slonik#450 (comment)

There is now a bridge to use slonik on top of postgres.js instead of node-postgres: https://github.com/gajus/postgres-bridge

Metadata

Metadata

Assignees

No one assigned

    Labels

    infrastructureChanges to core libraries or setup

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions