Estoy usando la biblioteca prisma.io y tengo problemas para trabajar con literales de plantilla para hacer lo que quiero. Tal vez no los entiendo lo suficientemente bien.
tengo esta llamada:
const result = await prisma.$queryRaw`SELECT * FROM User WHERE active = ${activeSetting}`Y esto funciona exactamente como yo quiero.
Sin embargo, quiero agregar opcionalmente una cadena al final sin tener que rehacer la declaración completa.
Es decir, quiero algo como:
let result; if (orderBy === "ASC") { const result = await prisma.$queryRaw`SELECT * FROM User WHERE active = ${activeSetting} ORDER BY ASC` } else if { const result = await prisma.$queryRaw`SELECT * FROM User WHERE active = ${activeSetting} ORDER BY DESC` } Básicamente, no quiero tener que completar declaraciones que comiencen con const result = await . Me doy cuenta de que este es un ejemplo corto, pero mi problema es cuando tengo declaraciones SQL bastante largas y me encuentro cortando y pegando un SQL enorme que es propenso a errores.
Puedes usar un operador ternario así:
const result = await prisma.$queryRaw`SELECT * FROM User WHERE active = ${activeSetting} ORDER BY ${orderBy === 'ASC' ? 'ASC' : 'DESC'}`Pero es mejor no escribir cadenas de SQL sin procesar porque podría quedar vulnerable a la inyección de SQL.
Me doy cuenta de que podría haber hecho una declaración SQL mucho más grande, así como concatenar fragmentos de código más grandes y eso habría aclarado el problema. Gracias a @CertainPerformance y @Phil por las ideas.
Esto es lo que realmente estaba buscando que resuelve mi mayor problema y todavía me mantiene a salvo, estoy bastante seguro.
const orderByAsc = Prisma.sql`ORDER BY ASC`; const orderByDesc = Prisma.sql`ORDER BY DESC`; const result = await prisma.$queryRaw`SELECT * FROM User WHERE active = ${activeSetting} ${ orderBy === 'ASC' ? orderByAsc : orderByDesc }`;Y también me permite poner expresiones en mis subcláusulas si es necesario.