打印脚本,MySQL:记录棱镜错误

smdnsysy  于 2022-12-10  发布在  Mysql
关注(0)|答案(1)|浏览(133)

我使用相同的Prisma客户机变量在一个序列中执行几个INSERT和UPDATE统计信息,所有这些都 Package 在一个TRY 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
    }
  }

谁能告诉我为什么会出现这个错误,以及如何使用PRISMA将PRISMA错误记录到数据库中?
谢谢。

rdrgkggo

rdrgkggo1#

我发现这个问题要归功于@Shea Hunter Belsky的评论
我正在记录来自打字脚本try/Catch的错误消息,错误中有很多单引号,这完全破坏了用于插入错误消息的动态SQL。我用扁虱代替了它们,然后所有的都起作用了。
但要做到这一点,我必须使用Prisma.$ecuteRawUnsafe,而不是具有如下字符串模板的prisma2.$ecuteRaw:

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括起来,而在字符串模板中则不需要。

相关问题