sql - 使用 TypeORM 與 NestJS 原生查詢返回插入的 ID:await connection.manager.query(`INSERT INTO
我希望返回 ID,或者更好的是,返回所有已插入的信息,使用 TypeORM 和 NestJS 的原始查詢。示例如下:
await connection.manager.query(`INSERT INTO...`)
當將查詢指派給一個常數並在下面使用控制台記錄時,它不會產生任何有用的信息:
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 2,
warningCount: 1,
message: '',
protocol41: true,
changedRows: 0
}
如你所見,它不返回任何相關信息,上面的 insertId 顯然是不正確的,並且每次都會返回這個,無論查詢的實際參數是什麼。
我知道使用更典型的 TypeORM 查詢時,你可以使用 .return(['name_of_column_you_want_returned']).execute(),它會正確地返回相關信息。有沒有辦法用原始查詢做到這一點?謝謝!
答案#1
簡而言之,你從 INSERT 指令獲得的是原始的 mariadb 驅動回應 (OkPacket),如果要查看資料,則需要新的 SELECT 查詢。
你正在使用 TypeORM 的 EntityManager,而文件中沒有提到返回值。查看 query 的源碼,返回類型是 any。由於它是一個原生查詢,它可能會根據你使用的資料庫類型返回一個物件,而不是具有標準格式。
在這種情況下,你正在使用 MariaDb,它返回了一個 OkPacket。這裡是文件說明:https://mariadb.com/kb/en/ok_packet/
答案#2
我知道原作者提到的是 mariadb,但使用 postgres 也會出現類似的問題。Insert 語句似乎只返回元數據,直接在 sql 查詢(pgadmin)工具中執行 sql 能記錄插入的行數。在 postgres 中,你可以使用 INSERT .... RETURNING * 語句,typeorm 也會提供結果。我還沒有用 mariadb 的驅動測試過,但希望也有類似的功能。