我是Node.js的新手,我在我的sql数据库2表中,一张叫做俱乐部的桌子和一张叫做球员的桌子,它们通过一对多的关系联系在一起,所以我在Flutter中创建了一个post查询,从我的查询中我想发送俱乐部的名字,俱乐部的价格将他们插入到第一个表中,并且在同一个查询中发送该队的选定球员列表,并做一个循环将他们插入到第二个表中,并为每个球员插入俱乐部的id,但是我发现我自己不知道我应该在Flutter或node.js中正确地操作什么,我正在尝试为我所尝试的东西找到正确的语法,在执行之后我在node.js中出现了一个错误,它说
json输入意外结束,原因可能是玩家(这是一张桌子,而不是table club中的一个字段)
这里我尝试了:
create:(data,callback)=>{
pool.query(
insert into club(userid,name,price) values(?,?,?),
[
data.userid,
data.name,
data.price,
],
(error,results,fields)=>{
if(error){
callback(error);
}
return callback(null,results);
}
);
for(item in data.players){
pool.query(
`insert into players(id,firstname,lastname,position,price,appearences,goals,
assists,cleansheets,redcards,yellowcards,image,clubid) values(?,?,?,?,?,?,?,?,?,?,?,?,?)`,
[
data.players.id,
data.players.firstname,
data.players.lastname,
data.players.position,
data.players.price,
data.players.appearences,
data.players.goals,
data.players.assists,
data.players.cleansheets,
data.players.redcards,
data.players.yellowcards,
data.players.image,
data.players.clubid,
],
(error,results,fields)=>{
if(error){
callback(error);
}
return callback(null,results);
}
);
}
},
以下是我的数据库的外观:
table Club:id userid
表球员:id第一名最后一名位置价格出场进球助攻干净床单红牌黄牌图像clubid
clubid是表club的外键,我知道它应该是最后插入的id,但我不知道如何使用正确的语法
如有任何帮助,我将不胜感激
这里有两个问题。
首先,第二次插入时要使用的唯一clubid
我想是由MySQL的autoincrement特性在第一次插入时生成的。您可以从result.insertiD
中的查询回调中获取它。然后将其传递给第二个查询。
其次,您在这里没有正确处理MySQL查询的异步性质。在知道第一次插入完成之前,无法执行第二次插入。因此,必须从第一个查询的回调内部进行第二次插入。
或者更好地使用mysql2包和async
/await
。类似这样的东西(未调试)。
create: async (data,callback) => { /* async! */
const myPool = pool.promise() /* promise! */
const {results, fields} = await myPool.query( /* await! */
'insert into club(userid,name,price) values(?,?,?)',
[ data.userid, data.name, data.price] )
const clubid = results.insertId
for(item in data.players) {
const {results, fields} = await myPool.query( /* await! */
`insert into players
(id, firstname, lastname, position,
price, appearences, goals, assists,
cleansheets, redcards, yellowcards,
image, clubid)
values(?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[ /* NOTE use item.whatever not data.players.whatever,
* because data.players is an array of objects */
item.id, item.firstname, item.lastname, item.position,
item.price, item.appearences, item.goals, item.assists,
item.cleansheets, item.redcards, item.yellowcards,
item.image,
clubid ] /* NOTE not item.clubid ! */
)
} /* end for (item in data.players) */
}
}
专业提示:花每一秒钟的时间来弄清楚Async
/Await
和相关的Promission
API是值得的。如果你不这样做,你就会陷入所谓的“回拨地狱”。它上面有一个牌子,上面写着“你们进入这里的人,要放弃一切希望。”