我正在使用相同的prisma客户端变量在一个序列中执行几个插入和更新语句,所有语句都包装在一个try catch中。
在catch中,我想将错误记录到数据库中,但我得到了错误:
下面是我的代码:无效
prisma.$executeRaw()
调用:原始查询失败。代码:N/A
。消息:N/A
let prisma = await new PrismaClient({
datasources: {
db: {
url: dbUrl,
},
},
});
try {
await prisma.$executeRaw`
INSERT INTO table1(col1, col2)
VALUES (val1, cal2);`;
await prisma.$executeRaw`
INSERT INTO table2(col1, col2)
VALUES (val1, cal2);`;
} catch (err: any) {
console.log('Error doing and sql insert: ' + err);
// Update the log item in the db with the error.
try {
console.log('getting ready to log sql error')
// We can't use the prisma variable above becuase it probably died when we got the error
// so create a new prisma variable here.
// The exception is on the next line.
let prisma2 = await new PrismaClient({
datasources: {
db: {
url: dbUrl,
},
},
});
await prisma2.$executeRaw`
UPDATE FisImportLog
SET Success = 0, Message = 'Error at: ${msg}. ' + ${err}
WHERE FisImportLogGUID = ${logId};`;
} catch (err: any) {
console.log('FIS Import *Log* Error Message: ' + err);
// This was really bad!!!
// Call notification service here
}
}
谁能告诉我为什么我得到这个错误,以及我如何使用棱镜记录一个棱镜错误到数据库?
谢谢。
我发现了这个问题,感谢@Shea Hunter Belsky的评论
我正在记录来自Typescript try/catch的错误消息,错误中有很多单引号,这完全破坏了用于插入错误消息的动态sql。我把它们换成了刻度,然后就都工作了。
但要做到这一点,我必须使用棱镜。$executeRawUnsafe而不是prisma2。$executeRaw使用如下字符串模板:
let errMessage = err.toString().replace(/'/g, "`")
let errorLogSQL = `
UPDATE FisImportLog
SET Success = 0, Message = 'Error at: ${msg}: ${errMessage}'
WHERE FisImportLogGUID = '${logId}';`;
await prisma.$executeRawUnsafe(errorLogSQL);
注意:我还必须在where子句中用单引号包装ID,因为在字符串模板中我不这样做。