Tengo un problema al obtener columnas específicas de la base de datos. Quiero recuperar el saldo de un usuario con el ID de usuario y la moneda proporcionados.
import dotenv from 'dotenv'; import pkg from 'pg'; dotenv.config(); const {Pool, Client} = pkg const DB_USER = process.env.DB_USER; const DB_HOST = process.env.DB_HOST; const DB_DATABASE = process.env.DB_DATABASE; const DB_PASSWORD = process.env.DB_PASSWORD; const DB_PORT = process.env.DB_PORT; const credentials = { user: DB_USER, host: DB_HOST, database: DB_DATABASE, password: DB_PASSWORD, port: DB_PORT, }; async function getBalance(user_id, currency) { const pool = new Pool(credentials); const res = await pool.query('SELECT $1 FROM wallet WHERE user_id = $2;', [currency, user_id]); console.log(res.rows); await pool.end(); }Y obtengo >[ { '?column?': 'USD' } ] para la moneda proporcionada = 'USD', en lugar de [ {'USD': 1.2}]. Y cuando no uso el nombre de la columna, obtengo saldos completos para un usuario.
La tabla se parece a esto: user_id | USD | euros | GBP | ... 123123 1,2 2,3 3,4
(Saldos para ese usuario en esa moneda), por lo que para el usuario 123123, su saldo en USD es 1,2, EUR es 2,3 y GBP es 3,4
No puede parametrizar un nombre de columna, deberá crear la cadena SQL dinámicamente para eso:
async function getBalance(user_id, currency) { const client = new Client(credentials); await client.connect(); const query = 'SELECT '+client.escapeIdentifier(currency)+' FROM wallet WHERE user_id = $1;'; const res = await client.query(query, [user_id]); console.log(res.rows); await client.end(); } También es posible que desee validar los nombres de moneda para que sean columnas existentes (y no 'user_id' ), como
if (!['USD', 'EUR', 'GBP'].includes(currency)) throw new RangeError('Currency not available');