我正在寻找一种对我的 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 '' 是要插入的新参数。
因为有效负载为每个键提供了一个数组,所以我不知道如何继续。如何将有效负载转换为更可用的东西。
我尝试在谷歌上查找,但没有找到我可以遵循的好例子(我理解)。我对此很陌生。
任何人都可以让我走上正轨吗?
谢谢
在你的
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)
当然,您需要生成这些命令并对它们进行参数化。