Estoy trabajando en el backend de una aplicación web que usa node-postgres y tengo curiosidad por saber qué piensan los demás. Necesito consultas de inserción básicas para una tabla de usuarios, una tabla de productos y otras tablas por venir. No quiero código redundante, pero tampoco quiero aflojar la legibilidad. ¿Sería mejor tener varias funciones de consulta similares:
NOTA: createValueString() solo crea una cadena de parámetros ($1, $2, $3)
async function createUser(user) { const client = await pool.connect(); const userKeys = Object.keys(user).join(","); const userValues = Object.values(user); try { const { rows } = await client.query( ` INSERT INTO users(${userKeys}) VALUES (${createValueString(user)}) RETURNING *; `, userValues ); console.log(`USER CREATED`, rows); return rows; } catch (error) { throw error; } finally { client.release(); } } async function createProduct(product) { const client = await pool.connect(); const productKeys = Object.keys(product).join(","); const productValues = Object.values(product); try { const { rows } = await client.query( ` INSERT INTO products(${productKeys}) VALUES (${createValueString(product)}) RETURNING *; `, productValues ); console.log(`PRODUCT CREATED`, rows); return rows; } catch (error) { throw error; } finally { client.release(); } }
O sería mejor crear una función dinámica:
async function insertQuery(tableName, item){ const client = await pool.connect(); const itemKeys = Object.keys(item).join(","); const itemValues = Object.values(item); try { const { rows } = await client.query( ` INSERT INTO ${tableName}(${itemKeys}) VALUES (${createValueString(itemValues)}) RETURNING *; `, itemValues ); console.log(`ITEM CREATED`, rows); return rows; } catch (error) { throw error; } finally { client.release(); } }
Potencialmente podrías tener ambos. En general, desea que el código sea bastante claro sobre qué código hace qué, así que insertQuery();
no grita exactamente esto crea un usuario. Donde como, createUser();
obviamente lo hace.
Lo que puede tener es una función como executeQuery(sql, params);
como tu segunda idea con funciones dinámicas. Como resultado, no tenga código redundante/repetitivo.
Simplemente pase la cadena SQL y los parámetros. Esto funciona y tiene más sentido con los procedimientos almacenados, que es lo que te recomiendo que hagas.
const executeQuery = (sql, params) => { // sql = "Call stored_procedure_name(parameter list)"; // params = [name, age, etc] // Perform query code .. // pool being a configured database connection object. pool.query(sql, params); }
Luego, tenga las distintas funciones que necesita reutilice esto.
const createUsers = () => { const sql = "Call createUserProcedure(params)"; const params = [name, age, etc]; const res = executeQuery(sql, params); }
Versión mysql:
const sql = "CALL CreateUser(?,?);"; const params = [name,age,etc]; const res = await executeQuery(sql, params);