We've used Knex and it works well provided you don't need features such as repeatable migrations.
Imo you should actually differentiate your migrations between schema changes and data mutations. That allows you to use a more powerful tool like liquibase/flyway for schema yet use your preferred language (JS/TS) for data mutations which might need other libraries.
I'm curious if people have tried this approach before.
Random: just don't use Bookshelf (ORM, based on Knex) unless you evaluate it well: when we used it, it did individual SELECTs for any included, related rows...
Imo you should actually differentiate your migrations between schema changes and data mutations. That allows you to use a more powerful tool like liquibase/flyway for schema yet use your preferred language (JS/TS) for data mutations which might need other libraries.
I'm curious if people have tried this approach before.