Slonik: A PostgreSQL client with strict types, detailed logging, and assertions

by sarahdellysseon 3/10/21, 8:12 PMwith 18 comments
by chmod775on 3/11/21, 1:02 AM

I like the idea and project goals.

There are however gems like this in the source:

https://github.com/gajus/slonik/blob/master/src/routines/exe...

You can spend an hour trying to reason about the control flow of that triple try/catch alone. Bonus points if that function can recursively call itself (not sure what retryTransaction can get up to).

There may be an explanation for this horrifying code, but it should probably be right above in the form of:

     /* 
      * The following code is not for the weak minded.
      *
      * Great care needs to be taken with it, for even the smallest mistake
      * risks summoning the gods of old to end all life on earth
      * in the most terrible way imaginable.
      * 
      * There is however no other way because a, b, and c.
      */
To untangle that mess you'd probably have to rewrite it once just to understand it, rewrite it again to get it right, then spend a month getting the edge-cases right.

But at least afterwards a newcomer can fix a bug without endangering the multiverse.

by hermanradtkeon 3/10/21, 10:19 PM

Great to see this package here. We have been using slonik for over a year now with few regrets. I am not a fan of query builders. Query builders work for simple inserts or updates. For really complex queries, nothing beats writing SQL inside of the sql template tag.

Another nice thing about slonik is that it is built on top of https://github.com/brianc/node-postgres. One gets all the benefit of node-pg with the nicer dev experience of slonik.

by joshxyzon 3/11/21, 2:43 AM

Anyone know how this compares to porsager's "postgres" lib?

https://github.com/porsager/postgres

by hardwaresoftonon 3/11/21, 3:00 AM

Have to say I'm pretty happy with TypeORM[0], this is going to have to be really good to pry that from my hands.

Slonik does have a wonderfully smaller API surface and I sure do like writing SQL manually and getting to take advantage of various lower level benefits (ex. postgres JSON operations) without too much fuss/work arounds, but TypeORM also lets you drop to raw (but parametrized) SQL fairly quickly, and it's query builder is actually pretty good...

[0]: https://typeorm.io/

by janpoton 3/10/21, 10:47 PM

Last few years I've been using a similar workflow with something like https://www.npmjs.com/package/pg-template-tag in combination with `pg`. I'm never going back to ORMs and query builders.

by jeffromon 3/10/21, 11:33 PM

Great library, gets out of the way while preventing common mistakes. makes my work easier. Thank you gajus!!!

by udevon 3/11/21, 12:51 AM

As a memory aid, Slonik means "little elephant" in Russian, and probably other Slavic languages.

by iunkon 3/11/21, 2:44 AM

I wish it had a standard OSS license