如何在具有异步和池的节点中使用 Mysql2 获取 MySQL 的 insertId?
How to get insertId for MySQL using Mysql2 in Node with async and pool?
我正在尝试将 async await 与 mysql2 和池一起使用,但我认为我做错了。下面是我的代码(正如我所说,我不确定我是否在这里做事)。
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
database: 'test',
password: '',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
const promisePool = pool.promise(); // Get a Promise wrapped instance of that pool
app.post('/api/register', (req, res) => {
async function queryDB() {
try {
const addUser = await promisePool.execute(
"INSERT INTO users (company, email, password) VALUES (?,?,?)",
['Ikea', 'Ikea@ikea.com', '123'],
)
const addAnother = await promisePool.execute(
"INSERT INTO users (company, email, password) VALUES (?,?,?)",
['Google', 'Google@google.com', '123']
)
console.log(addUser)
res.status(200).json('Users saved')
} catch (err) {
console.log(err)
res.status(409).json('User already exist')
};
}
queryDB();
})
思路是“addUser”要保存,如果不唯一会报错(因为SQL数据库email列设置为唯一)然后addAnother不会启动正在插入。
我无法理解的是如何从addUser插入中获取insertId?我将需要它来进行第二次插入。如果我 console.log addUser 我可以看到这样的对象:
ResultSetHeader {
fieldCount: 0,
affectedRows: 1,
insertId: 72,
info: '',
serverStatus: 2,
warn
所以 insertId 被发回给我,但我似乎无法访问它。如果我试图抓住它,它会说无法读取 属性 of undefined。我觉得我做这一切都是错误的,那么我应该怎么做才能获得 insertID?
如果您将多行插入同一个 table,并且 table 有一个 AUTO_INCREMENT
主键样式列,服务器会为您分配值。您无需知道插入的第一行的 insertId
即可正确插入第二行。
您需要的 insertId
值在 addUser.insertId
.
const addUser = await promisePool.execute(
"INSERT INTO users (company, email, password) VALUES (?,?,?)",
['Ikea', 'Ikea@ikea.com', '123'],
)
const theInsertIdForAddUser = addUser.insertId
但请注意,它也可以通过 SQL LAST_INSERT_ID() function 在下一个 MySQL 语句中直接检索。这让你可以做这样的操作。
INSERT INTO users_properties
(key, value, userId)
VALUES ('tel','555-1212',LAST_INSERT_ID());
您不必将值发回。
结果好像在一个数组中。我解决了它:addUser[0].insertId
。不过,我从来没有让 LAST_INSERT_ID() 工作。
insertId: 72
你的回复里有。
我正在尝试将 async await 与 mysql2 和池一起使用,但我认为我做错了。下面是我的代码(正如我所说,我不确定我是否在这里做事)。
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
database: 'test',
password: '',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
const promisePool = pool.promise(); // Get a Promise wrapped instance of that pool
app.post('/api/register', (req, res) => {
async function queryDB() {
try {
const addUser = await promisePool.execute(
"INSERT INTO users (company, email, password) VALUES (?,?,?)",
['Ikea', 'Ikea@ikea.com', '123'],
)
const addAnother = await promisePool.execute(
"INSERT INTO users (company, email, password) VALUES (?,?,?)",
['Google', 'Google@google.com', '123']
)
console.log(addUser)
res.status(200).json('Users saved')
} catch (err) {
console.log(err)
res.status(409).json('User already exist')
};
}
queryDB();
})
思路是“addUser”要保存,如果不唯一会报错(因为SQL数据库email列设置为唯一)然后addAnother不会启动正在插入。
我无法理解的是如何从addUser插入中获取insertId?我将需要它来进行第二次插入。如果我 console.log addUser 我可以看到这样的对象:
ResultSetHeader {
fieldCount: 0,
affectedRows: 1,
insertId: 72,
info: '',
serverStatus: 2,
warn
所以 insertId 被发回给我,但我似乎无法访问它。如果我试图抓住它,它会说无法读取 属性 of undefined。我觉得我做这一切都是错误的,那么我应该怎么做才能获得 insertID?
如果您将多行插入同一个 table,并且 table 有一个 AUTO_INCREMENT
主键样式列,服务器会为您分配值。您无需知道插入的第一行的 insertId
即可正确插入第二行。
您需要的 insertId
值在 addUser.insertId
.
const addUser = await promisePool.execute(
"INSERT INTO users (company, email, password) VALUES (?,?,?)",
['Ikea', 'Ikea@ikea.com', '123'],
)
const theInsertIdForAddUser = addUser.insertId
但请注意,它也可以通过 SQL LAST_INSERT_ID() function 在下一个 MySQL 语句中直接检索。这让你可以做这样的操作。
INSERT INTO users_properties
(key, value, userId)
VALUES ('tel','555-1212',LAST_INSERT_ID());
您不必将值发回。
结果好像在一个数组中。我解决了它:addUser[0].insertId
。不过,我从来没有让 LAST_INSERT_ID() 工作。
insertId: 72
你的回复里有。