3 ms·
This seems to be solving mostly the same problem as the following libraries: [1] https://github.com/phiresky/ts-typed-sql https://github.com/phiresky/ts-typed-
by phiresky 7y ago
This seems to be solving mostly the same problem as the following libraries:
[1] https://github.com/phiresky/ts-typed-sql https://github.com/phiresky/ts-typed-sql
[2] https://github.com/Ff00ff/mammoth https://github.com/Ff00ff/mammoth
[3] https://github.com/AnyhowStep/tsql https://github.com/AnyhowStep/tsql
[4] https://github.com/travigd/vulcyn https://github.com/travigd/vulcyn
A query in one of those looks like the following:
const rows = await select(list.id, list.createdAt)
.from(list)
.where(list.createdAt.gt(now().minus(`2 days`)).or(list.value.eq(0)))
.limit(10);
The resulting type of `rows` is inferred by TypeScript to the corresponding correct type (`{id: string, createdAt: Date}`)
Prisma solves the problem by generating code, while all of these do it completely in type-level within typescript. Prisma also seems to introduce its own query language, while the above linked libraries stay closer to SQL.
[1] was written by a friend of mine and I'm using it in production to great success. I wouldn't recommend it though because it has repeatedly broken with new TypeScript updates since it uses very complex type structures and the dev has basically given up on it due to the complexity.
[2] is probably the most production-ready, though it has some design choices I'm not sure about.
[3] is the most well-designed, and can handle complex scenarios (including differentiating between join types etc). But it's incomplete so far.
[4] I have not used.
Pure type-level has the advantage of not adding a compile-step and keeping everything in a tool you already know. But all of the above have the disadvantage that the resulting type structures are very complex - most TS devs would have a hard time understanding the internals of the libraries and the resulting type errors can be unreadable. They can also cause the TS compiler to slow down significantly (in the past [1] had exponential compile time when adding a new column, though this has been fixed).
Also, since the TS compiler uses heuristics in multiple places and the type system is not sound, Microsoft has introduced regressions that have broken [1] in every other release.
- adsharma 7y agoThis doesn't work well when you have lots of queries that require a self-join. Get me a friend of a friend of a friend who joined 2 days ago. https://github.com/facebookexperimental/fquery/blob/master/tests/test_operators.py https://github.com/facebookexperimental/fquery/blob/master/t...
- timmy-turner 7y agoThanks for sharing these projects. So far I only knew tsql. I'm in the avoid code generation camp as well as typically my build processes are complex enough and don't need another step. But I am not quite satisfied by the existing query generators. Also after having read https://github.com/jawj/mostly-ormless/blob/master/README.md https://github.com/jawj/mostly-ormless/blob/master/README.md I wanted to put Postgres' `json_agg` function into use as it looks like it is simplifying a lot of the nested objects stuff one serves over REST APIs. So I designed my own https://github.com/hoeck/typesafe-query-builder https://github.com/hoeck/typesafe-query-builder - with special support for `json_agg` and `json_build_object`. Its working already in production and for me, the dev UX is unprecedented in working with database code. Typechecks and autocompletions really boost it. But to be honest, I'm a bit worried about Typescript compiler bugs and compilation times when the project grows.