Array<string> vs Record<key, true>?

So, this is a call for mental help lol. First this is a taste question, is not a necesary question and is clearly a dum question, but i wanna ask any way. In my lastest months i been working usually in backend stuff, and primary using Prisma for schema and some queries, because is VPS not serverless, Kysely for some complex queries, and Zod for validation (DTO and others stuffs). All is good, everything work perfectly (ignoring the lack of some query functionalities in Prisma). But there is something that really BOTHER me when i read the code. For example when picking fields in a prisma query, you do a something like this:
const query = await prisma.user.findMany({
select:{ id: true, name: true, last_name: true }
})
const query = await prisma.user.findMany({
select:{ id: true, name: true, last_name: true }
})
This kind of API is truly intuitive, feels nice. But then using Kysely is something like this:
const query = await kysely.selectFrom('User').select(['id','name','last_name']).execute()
const query = await kysely.selectFrom('User').select(['id','name','last_name']).execute()
This also feels nice, but when the query grow too much, usually when conditionals are added or too much select fields added, i feel that the kysely way it feels more verbose. Another case is validation library like zod, i really love zod, too much hahaha.
zodDataSchema.pick({
name: true,
hello: true,
});
zodDataSchema.pick({
name: true,
hello: true,
});
Again, they use the Record<key, true> approach to pick/omit/required/partial objects, just like prisma does. But then most utility libraries like lodash, or remedajs use Array<string> approach, this make me create my own libraries to have similar approach to Record<key, true> approach
//Remeda js way
const remeda = R.pick(data, ["age", "isAdmin", "name"]);
//Example custom zod way
const custom = util.pick(data, {
age: true,
isAdmin: true,
name: true,
});
//Remeda js way
const remeda = R.pick(data, ["age", "isAdmin", "name"]);
//Example custom zod way
const custom = util.pick(data, {
age: true,
isAdmin: true,
name: true,
});
So, my question is, is healthy and good that i wanna choose only one way of doing picking/omit in objects? I been building my own alternatives to Remeda or Kysely but Record<key, true> approach, what do you think? Do you like it? I'm just testing.
No description
No description
11 Replies
oljimenez
oljimenez•11mo ago
Let me clarify that in the Kysely approach, i'm not recreating Kysely from scratch, this is just a test functions and clases that wrap kysely API to give this Record<key, true> API and still work on progress. I'm not so crazy to try to rebuild kysely myself alone lol.
jackmcbride_98
jackmcbride_98•10mo ago
Seems a little obsessive to me. Could you make a wrapper around kysely that basically does things in the way prisma does and then maps it to kysely?
oljimenez
oljimenez•10mo ago
i don't know yet if i can do everything that kysely does, but i already did some basics stuffs, is a work on progress (like i showed in one of the pictures). My point with this question is that, it feel hugly to have differents APIs for all my cases, Prisma -> Record based, Zod -> Record based Kysely -> Array of string based Remedajs -> Array of strings based It feels ugly to have so different APIs for this similars things in only single codebase.
One advantage of having the same kind of API in all proyect codebase, is copy and paste. This is why i love prisma and zod working together, because i can copy and paste select statements so ez. But yeah, is clearly obsessive from my part, that's why i'm asking 😂
jackmcbride_98
jackmcbride_98•10mo ago
I get why you don't like it, what are the use cases that prisma doesnt support? Perhaps you can find another way round it or make a PR to the library to support it
oljimenez
oljimenez•10mo ago
Prisma don't support aggregate functions with conditions on relations, example, Select all clients that have an order count > 8, or sum order.total_price > 200
jackmcbride_98
jackmcbride_98•10mo ago
Would you be able to do it in seperate queries? I know thats a pain, but might be a bit easier than using kysely and rebuilding it in a prisma way XD
oljimenez
oljimenez•10mo ago
yeah, but is hard to make those findMany in two queries, because i would have to omit pagination for the first query and ended pulling thousand of records or more just to do another filter and then manually grouping, with Kysely is way simpler and clearly more performant, but yeah, it break the same feel of using prisma like for everyting I could try to make PR for prisma to fix those issues, but already exist issues/proposals that suggest this in their repo from months or years and they/anybody haven't fix them, so maybe is not easy to do, maybe i'm wrong.
oljimenez
oljimenez•10mo ago
GitHub
Search by relation count eq | gt | lt · Issue #8935 · prisma/prisma
Problem I think the issue should be related with #3821 model Topic { id Int @id @default(autoincrement()) title String @db.MediumText content String @db.LongText voters VotersOnTopics[] watchers Wa...
oljimenez
oljimenez•10mo ago
a year without fixing. I really give up, excepting that the Prisma Client would be fixed in any time soon, that's why i choose Kysely, is better, more control and features, but is more verbose in my opinion, that's why i was trying that wrapper idea
jackmcbride_98
jackmcbride_98•10mo ago
Fair, you could have a go at creating that feature in the Prisma codebase, or just accept that you'll have different syntax for some queries. I've heard good things about kysely, could also just switch over to that if its better
oljimenez
oljimenez•10mo ago
yeah, currently i'm using both, and in this proyect i won't chage that, but i'm trying to build/PR something to fix this ''code style issue'' so in the future i could use both in similar ways or even use kysely always.
Want results from more Discord servers?
Add your server
More Posts
tailwind linter giving me a wrong warning?how would i go about combining this in tailwind? its giving me the warning of them being the same vaRegular Hexagon Plane using BufferGeometry in React Three FiberPretty self explanatory but i can't seem to wrap my head around this one last bit. I have all the mat3-env is giving error module is not defined in ES module scopei am trying to add t3-env in my project and it is giving me error ```js - error Failed to load next.Deploying to Vercel - now errors with build and dev part 2This is part 2, the error message ==== This is the output running either pnpm dev or build - info LoDeploying to Vercel - now errors with build and dev part 1I've been developing a T3 app, using first MySQL in Docker and then Postgres in Docker without any pCombining tRPC and Nextjs13 SuspenseHi there Did somebody succeed using Nextjs 13 App Routing Suspense features, like loading.tsx and tUse next-international without converting page.tsx or layout.tsx into client componentsI'm trying to use `next-international` but in their github readme https://github.com/QuiiBz/next-intCan t3 app be deployed on a traditional server and a tradition database?I kind of fear being locked into these solutions like planelscale, vercel, clerk etc. So, in case ifGithub Oauth not triggeringjust created a new t3 app and removed discord oauth provider and added github oauth provider. ThenT3 BETA - how to query on client side?I am using t3-app@7.13.2-beta.ca0b017 with nexjs 13. How can I make a query or a mutation on a clie