Как сделать вспомогательный метод для PSQL для вставки значений в БД - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь встроить в свой NodeJS API помощник для запросов, поэтому мне не нужно будет писать всегда или почти всегда одни и те же запросы, просто меняющиеся как имя таблицы, значения и параметры. Я использую PG без ORM в качестве упражнения для SQL запросов.
Я пытаюсь создать универсальный помощник INSERT, подобный следующему

insertOne(table, values, params) {
        const arr1 = [...values];
        const arr2 = [...params];
        return query(`INSERT INTO ${table}
                        (${arr1})
                        VALUES ($1, $2, $3, $4, $5, $6)
                        RETURNING*`, [arr2]);
    }

Я пытался сделать так, но получаю сообщение об ошибке:

"bind message supplies 1 parameters, but prepared statement "" requires 6"

То, чего я хочу добиться, - это иметь возможность вставлять в вызов БД, когда мне нужен этот метод, для замены используемого мной сейчас nex-запроса:

async createOne(req, res) {
        console.log({ ...req.body });
        try {
            const product = await query(
                `INSERT INTO products
                    (productname, description, brand, price, category, imageurl)
                VALUES ($1, $2, $3, $4, $5, $6)
                RETURNING*`,
                [
                    req.body.productname,
                    req.body.description,
                    req.body.brand,
                    req.body.price,
                    req.body.category,
                    req.body.imageurl
                ]
            );
            res.json({ msg: "Product added", data: product.rows });
        } catch (err) {
            return res.json({ msg: "POST Something went wrong!", err: err });
        }
    }

Я хотел бы иметь возможность заменить то, что выше, помощником, передающим значения и параметры в качестве аргументов при вызове метода. Но я застрял и мне нужна помощь, чтобы все заработало.

[РЕДАКТИРОВАТЬ] Добавление помощника, как требуется, комментируя весь файл:

const { query } = require("../db/dbConnect");

const Queries = {
    findAll(table) {
        return query(`SELECT * FROM ${table}`);
    },

    findOne(table, id, params) {
        return query(`SELECT * FROM ${table} where ${id} = $1`, [params]);
    },

    insertOne(table, values, params) {
        const arr1 = [...values];
        const arr2 = [params];
        return query(
            `INSERT INTO ${table}
                        (${arr1})
                        VALUES ($1, $2, $3, $4, $5, $6)
                        RETURNING*`, [arr2]
        );
    }
};

module.exports = { Queries };

И вставка одного вызова

async createOne(req, res) {
    console.log({ ...req.body });
    try {
        const product = await Queries.insertOne(
            "products",
            [
                "productname",
                "description",
                "brand",
                "price",
                "category",
                "imageurl"
            ],
            [
                req.body.productname,
                req.body.description,
                req.body.brand,
                req.body.price,
                req.body.category,
                req.body.imageurl
            ]
        );
        res.json({ msg: "Product added", data: product.rows });
    } catch (err) {
        return res.json({ msg: "POST Something went wrong!", err: err });
    }
},
...