Node Hapi.js 批量更新到 mariaDB

问题描述 投票:0回答:1

我正在寻找一种对我的 MariaDB 进行批量更新的方法。我将 Node.js mariaDB 插件和 HAPI.js 与 Handlebars 结合使用。我对 javascript 很陌生,但在我的小项目上已经取得了很大的进展,对工作犬(比利时玛利诺犬)进行一些研究。这是为了我自己学习使用 Javascript、Node 和 MariaDB。

我的问题: 我有一个包含多个参数的网页,可以通过表单进行编辑。

数据库:aped_db.parameters

TABLE `parameters` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
    `description` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
    `opt0` VARCHAR(50) NOT NULL DEFAULT 'Unknown' COLLATE 'utf8mb4_general_ci',
    `opt1` VARCHAR(50) NOT NULL DEFAULT 'Very bad' COLLATE 'utf8mb4_general_ci',
    `opt2` VARCHAR(50) NOT NULL DEFAULT 'Bad' COLLATE 'utf8mb4_general_ci',
    `opt3` VARCHAR(50) NOT NULL DEFAULT 'Ok' COLLATE 'utf8mb4_general_ci',
    `opt4` VARCHAR(50) NOT NULL DEFAULT 'Good' COLLATE 'utf8mb4_general_ci',
    `opt5` VARCHAR(50) NOT NULL DEFAULT 'Very good' COLLATE 'utf8mb4_general_ci',
    `multiplier` FLOAT NULL DEFAULT '1',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE INDEX `name` (`name`) USING BTREE
)

HTML 代码简短

{{#each parlist}}
    <input type="hidden" name="id" value="{{this.id}}" form="form-edit">
    <td style="text-align:center;">{{this.id}}</td>
    <td><input type="text" name="name" value="{{this.name}}" form="form-edit"></td>
    <td><input type="text" name="description" value="{{this.description}}" form="form-edit"></td>
    <td><input type="text" name="opt0" value="{{this.opt0}}" form="form-edit"></td>
    <td><input type="text" name="opt0" value="{{this.opt1}}" form="form-edit"></td>
    <td><input type="text" name="opt0" value="{{this.opt2}}" form="form-edit"></td>
    <td><input type="text" name="opt0" value="{{this.opt3}}" form="form-edit"></td>
    <td><input type="text" name="opt0" value="{{this.opt4}}" form="form-edit"></td>
    <td><input type="text" name="opt0" value="{{this.opt5}}" form="form-edit"></td>
    <td><input type="text" name="multiplier" value="{{this.multiplier}}" form="form-edit"></td>
{{/each}}

接收到的有效负载处理成表参数:

req.payload = {
   id: [ '1', '3', '' ],
   name: [ 'Social', 'Work ethic', 'Dominance' ],
   description: [ 'Desc 1', 'Desc 2', 'Desc 3'],
   opt0: [ 'Unknown', 'Unknown', 'Unknown' ],
   opt1: [ 'Very bad', 'Very bad', 'Very bad' ],
   opt2: [ 'Bad', 'Bad', 'Bad' ],
   opt3: [ 'Ok', 'Ok', 'Ok' ],
   opt4: [ 'Good', 'Good', 'Good' ],
   opt5: [ 'Very good', 'Very good', 'Very good' ],
   multiplier: [ '1', '1', '1' ]
}

上述有效负载中,2个参数是现有参数,第三个参数需要是新的INSERT。 我遇到的问题是,每个键都有一个数组。我希望每行都有一个数组。

参数 id '1' 和 '3' 是要更新的现有参数,参数 id '' 是要插入的新参数。

因为有效负载为每个键提供了一个数组,所以我不知道如何继续。如何将有效负载转换为更可用的东西。

我尝试在谷歌上查找,但没有找到我可以遵循的好例子(我理解)。我对此很陌生。

任何人都可以让我走上正轨吗?

谢谢

javascript node.js mariadb handlebars.js hapi
1个回答
0
投票

在你的

req.payload = {
   id: [ '1', '3', '' ],
   name: [ 'Social', 'Work ethic', 'Dominance' ],
   description: [ 'Desc 1', 'Desc 2', 'Desc 3'],
   opt0: [ 'Unknown', 'Unknown', 'Unknown' ],
   opt1: [ 'Very bad', 'Very bad', 'Very bad' ],
   opt2: [ 'Bad', 'Bad', 'Bad' ],
   opt3: [ 'Ok', 'Ok', 'Ok' ],
   opt4: [ 'Good', 'Good', 'Good' ],
   opt5: [ 'Very good', 'Very good', 'Very good' ],
   multiplier: [ '1', '1', '1' ]
}

payload 我们可以看到您拥有的所有字段以及代表一个值的每个索引。索引为 0 表示第一条记录,

id
'1'
,名称为
'Social'
,等等

新记录的

id
''
,其他记录是要更新的现有记录。因此,您将需要运行插入和更新。 MariaDB 允许您对插入进行分组,例如:

insert into yourtable(c1, c2, c3)
values
(v1_1, v1_2, v1_3),
(v2_1, v2_2, v2_3);

因此,在指定要插入的列之后,您可以使用

values
关键字,后面是用逗号分隔的括号,每个括号代表要插入的记录,括号内有用逗号分隔的列值。当然,您需要参数化实际值,但想法如下:

//building a keys array
let mykeys = [];
for (let key in items) {
    mykeys.push(key);
}
//building a values array
let values = [];
for (let index = 0; index < items[mykeys[0]].length; index++) {
    let record = {};
    for (let key of mykeys) {
        record[key] = items[key][index];
    }
    values.push(record);
}

然后,您可以循环

values
并检查每一步是否有
id
。如果它是空的,请将其添加到您的插入中。如果它不为空,请将其添加到您的数组中。我已经展示了您的插入需要如何相似,现在让我们重点关注您的更新需要如何相似。您有三个主要选项可供选择。

你可以有这样的东西:

update yourtable
set c1 = v1_1,
    c2 = v1_2,
    c3 = v1_3
where id = id1;
update yourtable
set c1 = v2_1,
    c2 = v2_2,
    c3 = v2_3
where id = id2;

单独更新每条记录,或者您可以进行一次复合更新(我没有测试这个):

update yourtable
set c1 = case
        when id = id1 then v1_1
        when id = id2 then v2_1
        when id = id3 then v3_1
    end,
    c2 = case
        when id = id1 then v1_2
        when id = id2 then v2_2
        when id = id3 then v3_2
    end,
    c3 = case
        when id = id1 then v1_3
        when id = id2 then v2_3
        when id = id3 then v3_3
    end
where id in (id1, id2, id3);

或者您可以替换为:

replace into yourtable(id, c1, c2, c3)
values
(123, v1_1, v1_2, v1_3),
(456, v2_1, v2_2, v2_3),
(789, v3_1, v3_2, v3_3)

当然,您需要生成这些命令并对它们进行参数化。

© www.soinside.com 2019 - 2024. All rights reserved.