iT邦幫忙

0

MySQL返回值是OkPacket,改怎麼處理?

  • 分享至 

  • xImage

大家好,
想請問大家一個問題,
當我想一次新增多筆資料進資料庫時,
SQL語法是INSERT INTO tableName(name,age) VALUES ("p1",18),("p2",10)
本來是希望資料庫能返回 RowDataPacket 的資料,

那我就可以使用JSON.parse(JSON.stringify(results)
將返回的資料轉成能用的JSON檔: [{name:"p1",age:18},{name:"p2",age:10}]

結果返回的值不是RowDataPacket,而是OkPacket。

/images/emoticon/emoticon20.gif

我該怎麼取出返回值呢?
我的環境是 Nodejs + MySQL。

以下是我的code。

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'graphql'
})
     
let query = `INSERT INTO ${tableName}(${tableStructure}) VALUES ${result}`
connection.query(query, (error, results, fields) => {
    if (error) throw error
    console.log(results) //這個
    //resolve(JSON.parse(JSON.stringify(results)))
})

想再請問一個問題,
只有查詢才會返回RowDataPacket,
而其他修改(insert,update,delete)皆會返回OkPacket嗎?

-------更新--------
我是用海綿大大提到的內建套件 const mysql = require('mysql')

剛剛測試一下,只有查詢會返回RowDataPacket,才能獲取資料。
其他的動作,如insert,update,delete,drop,truncate,都是返回OkPacket。

froce iT邦大師 1 級 ‧ 2022-12-16 16:26:14 檢舉
你都insert了,表示你自己程式一定找的到資料,檢查ok就存到你的暫存器,或重新select一次就好。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-12-16 15:47:50
最佳解答

根據這篇的說法
要用Sequelize
insert 一筆大概像這樣

sequelize.sync().then(() => {
   console.log('Book table created successfully!');

   Book.create({
       title: "Clean Code",
       author: "Robert Cecil Martin",
       release_date: "2021-12-14",
       subject: 3
   }).then(res => {
       console.log(res)
   }).catch((error) => {
       console.error('Failed to create a new record : ', error);
   });

}).catch((error) => {
   console.error('Unable to create table : ', error);
});

回傳大概像這樣

books {
  dataValues:
   { id: 1,
     title: 'Clean Code',
     author: 'Robert Cecil Martin',
     release_date: '2021-12-14',
     subject: 3,
     updatedAt: 2021-12-14T10:12:16.644Z,
   ...
}

接著再看著辦...

greenriver iT邦研究生 4 級 ‧ 2022-12-16 16:05:22 檢舉

謝謝,然怪 google 不到解法
/images/emoticon/emoticon46.gif

0
bill83a707
iT邦新手 5 級 ‧ 2022-12-17 08:51:59

你所提到的INSERT、UPDATE、DELETE等語句通常會返回OkPacket,而非RowDataPacket。

如果你想取出返回的OkPacket的資訊,可以使用以下方法:

connection.query(query, (error, results, fields) => {
    if (error) throw error
    console.log(results.affectedRows) // 返回受影響的行數
    console.log(results.insertId) // 返回新增資料的ID
    console.log(results.warningStatus) // 返回警告狀態
})

請注意,results是一個對象,而非數組。因此,你無法使用JSON.parse(JSON.stringify(results))將它轉換為JSON。

如果你想要使用JSON.parse(JSON.stringify(results))將結果轉換為JSON,你需要在執行查詢時使用SELECT語句,這樣才會返回RowDataPacket。

例如:

connection.query('SELECT * FROM tableName', (error, results, fields) => {
    if (error) throw error
    console.log(JSON.parse(JSON.stringify(results))) // 返回結果的JSON
})

我要發表回答

立即登入回答