使用 TypeORM 和 NestJS 原始查询返回插入的 id:await connection.manager.query(`INSERT INTO

问题描述 投票:0回答:2

我希望使用 TypeORM 和 NestJS 使用原始查询返回 id 或更好的是所有插入的信息。示例如下:

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()
它会很好地返回相关信息。有没有办法通过原始查询来做到这一点?谢谢!

sql typescript mariadb nestjs typeorm
2个回答
2
投票

tl;dr 您正在从 INSERT 命令获取原始 mariadb 驱动程序响应 (OkPacket),并且您需要一个新的 SELECT 查询来查看数据。


您正在使用 TypeORM EntityManager,并且文档没有提及返回值。 查看query的源码,返回类型为

any
。由于它是原始查询,因此它可能会根据您正在使用的数据库类型返回一个对象,而不是具有标准格式。

在本例中,您使用的是 MariaDb,它返回了

OkPacket
。这是文档: https://mariadb.com/kb/en/ok_packet/


0
投票

我知道OP声明mariadb,但是,使用postgres也会出现类似的问题。插入语句似乎只返回元数据,在 sql 查询(pgadmin)工具中直接执行 sql 会记录 no。插入的行数。 在 postgres 中,你可以使用

INSERT .... RETURNING *
语句来代替,typeorm 也提供结果。还没有使用 mariadb 的驱动程序进行测试,但我希望应该有类似的东西。

© www.soinside.com 2019 - 2024. All rights reserved.