node+mysql 踩坑笔记

关于字段自动补零zerofill

在执行node中执行一句sql,检查了属性名、属性类型、语法等等都没错,甚至直接在mysql中以该语句插入数据都是可以的,可是在node中一直抛出错误说我填入的某一数据为null。然后在后台的终端中发现打印数据的格式是这样的

1
2
// console.log([order.id,good.id])
[22,'00006']

第二个数据为什么显示是字符串呢,但我写的明明是int类型。然后发现是字段自动补零的锅。
我传入的数据是由book表搜索而来的,然后传入当前sql语句执行。

1
insert into orderDetail(oID,bID) values(?,?)

book表的bid加了zerofill属性,orderDetail依赖前面表中的bid,但没有写zerofill,而mysql也没有报错,我以为也不会有问题。但事实是:) ,自己坑了自己。

数据库提交和回滚

1
2
3
4
5
6
7
8
9
10
11
// 执行sql出错,数据回滚
conneciton.rollback(function() {
// ...
});
// 若成功修改数据,提交
connction.commit(function(err) {
if (err) {
connection.rollback(function() {
// ...
}
});

sql嵌套执行的是要要注意异步回调问题

1
2
3
4
5
6
7
8
9
10
11
12
pool.query(sql,[],(err1,r1)=>{
let results=[]
for(let i=0;i<r1.length;i++){
pool.query(sql2,[],(err2,r2)=>{
results.push(r2)
})
}
// result会先发送,此时result为空
res.json({
data:results // []
})
})