【问题标题】:Create a dynamic Mysql Insert from an Object从对象创建动态 Mysql 插入
【发布时间】:2023-03-11 05:28:01
【问题描述】:

我在 Typescript 中有一个项目,我试图通过我通过object 发送的选项创建一个插入。现在我有两个对象,每个插入一个,这些插入是在不同的表和不同的对象中创建的。我想知道是否可以为多个对象创建通用插入。

这是我目前拥有的:

let object1 = [
    { country: 'CO', name: 'CO_SE.xml', exists: 1 },
    { country: 'CO', name: 'CO_IN.xml', exists: 1 },
    { country: 'CO', name: 'CO_BR.xml', exists: 1 }
];

`INSERT INTO ${database} VALUES` + object1.map((elem: any) => 
                    `"${elem.country}", "${elem.name}", ${elem.exists})`).join(', ');

let object2 = [
    { code: 1, folder: '/ToFtp', max: 8 },
    { code: 2, folder: '/ToXml', max: 5 },
    { code: 3, folder: '/ToMail', max: 5 }
];

`INSERT INTO ${database} VALUES` + object2.map((elem: any) => 
                    `${elem.code}, "${elem.folder}", ${elem.max})`).join(', ');

这就是我想要达到的目标:

let object1 = [
    { country: 'CO', name: 'CO_SE.xml', exists: 1 },
    { country: 'CO', name: 'CO_IN.xml', exists: 1 },
    { country: 'CO', name: 'CO_BR.xml', exists: 1 }
];

let object2 = [
    { code: 1, folder: '/ToFtp', max: 8 },
    { code: 2, folder: '/ToXml', max: 5 },
    { code: 3, folder: '/ToMail', max: 5 }
];

`INSERT INTO ${database} VALUES` + ${object}.map((elem: any) => 
                    `"${elem.elem1}", ... ${elem.elemN})`).join(', ');

这可能吗?我不确定这是否可以做到。

【问题讨论】:

  • 几个额外的问题:1) object1 和 object 2 中的每个条目是否总是具有相同数量的条目(即使给定键的值可能为空)? 2) 您是否只需要针对恰好两个对象数组(object1 和 object2)的解决方案,还是需要针对任意数量的对象(即 object3、object4、objectN)的灵活性?
  • @dusthaines 1 - 他们不会总是拥有相同数量的票。 2 - 我需要它对多个对象灵活,我放的只是示例
  • 你在用mysql包吗?
  • @AmirSaleem 我正在使用 promise-mysql 包来创建数据库连接
  • 将动态内容直接添加到查询中是有风险的并且容易发生 SQL 注入。我建议你使用转义。如果你使用的是 mysql 包,你可以使用connection.query({ sql: "", values: [] }) 语法

标签: mysql node.js arrays typescript


【解决方案1】:

您可以创建方法来准备查询和值。你可以这样做。

let object1 = [
    { country: 'CO', name: 'CO_SE.xml', exists: 1 },
    { country: 'CO', name: 'CO_IN.xml', exists: 1 },
    { country: 'CO', name: 'CO_BR.xml', exists: 1 }
];

function getValues<T extends Record<string, any>[]>(obj: T) {
    const values = obj.map((item) => {
        const val = Object.values(item).map((v) => v);
        return val;
    });
    return values;
}

function getColumns<T extends Record<string, any>>(obj: T) {
    return Object.keys(obj);
}

function getFilters<T extends Record<string, any>>(obj: T) {
    const constraints: string[] = [];
    const queryArray: any[] = [];
    Object.entries(obj).forEach(([k, v]) => {
        constraints.push(`${k} = ?`);
        queryArray.push(v);
    });
    return {
        constraints,
        queryArray
    }
}

const columns = getColumns(object1[0]);
const values = getValues(object1);

const sql = `INSERT INTO MyTable(${columns.join(", ")}) VALUES ?`;

const filters = {
    country: "CO"
};
const selectFilters = getFilters(filters);

const selectSql = `SELECT ${columns} FROM MyTable WHERE ${selectFilters.constraints.join(" AND ")}`;

console.log(columns); // [ 'country', 'name', 'exists' ]
console.log(sql); // INSERT INTO MyTable(country, name, exists) VALUES ?
console.log(values); // [ [ 'CO', 'CO_SE.xml', 1 ], [ 'CO', 'CO_IN.xml', 1 ], [ 'CO', 'CO_BR.xml', 1 ] ]

// now you can use something like this
connection.query({ sql, values });

注意:请确保在使用这些功能之前清理您的输入,以避免如果您的输入与您期望的不一样,您可能会造成任何损害。

【讨论】:

  • 好的,如果你得到了数据并且看起来插入效果很好,现在我会理解代码了。如果我想做一个 Select,如果我想在 select、from 和 where 中有几个参数,它会如何工作?
  • 你能用英文写吗?
  • 添加一个完整的例子
  • 添加了过滤器示例
  • 我刚查了数据采集,数据还没有录入,Insert也没起作用。查询:INSERT INTO MyTable (country, name, exists) VALUES [['CO', 'CO_SE.xml', 1], ['CO', 'CO_IN.xml', 1], ['CO', 'CO_BR .xml ', 1]] 没有捕捉到它。以下作品:INSERT INTO MyTable (country, name, exists) VALUES ('CO', 'CO_SE.xml', 1), ('CO', 'CO_IN.xml', 1), ('CO', 'CO_BR .xml ', 1)
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2014-06-03
  • 2019-06-19
  • 1970-01-01
相关资源
最近更新 更多