搜尋

首頁  >  問答  >  主體

優化API中的SQL事務

<p>最近我參加了一次工作面試,然後我得到了一點作業。然後我收到了回饋,說我的更新端點中有不必要的查詢和事務組合。 </p> <pre class="brush:php;toolbar:false;">export const update = async (req: Request, res: Response, next: NextFunction) => { try { const reportId = parseInt(req.params.id) const { name, age, info } = req.body const report = await ReportModel.findOne({ where: { id: reportId } }) if (!report) return next(new EntityNotExistError("報告不存在")) await ReportModel.update({ name, age, info }, { where: { id: reportId } }) const _report = await ReportModel.findOne({ where: { id: reportId } }) return res.json({ message: "報告編輯成功", report: _report }) } catch (error) { return next(error) } }</pre> <p>如你所看到的,第一個查詢檢查實體是否存在,然後我會對實體進行更新,最後一個查詢會傳回更新後的實體。 有沒有一些方法可以優化與資料庫的通訊? </p>
P粉343408929P粉343408929456 天前458

全部回覆(1)我來回復

  • P粉201448898

    P粉2014488982023-08-19 10:18:35

    您的程式碼涉及到對資料庫的三個不同交互,用於單一更新操作:

    1. 檢查實體是否存在 | 程式碼:ReportModel.findOne()
    2. #更新實體 | 程式碼:ReportModel.update()
    3. 取得更新後的實體,以便在回應中傳回 | 程式碼:ReportModel.findOne()

    減少資料庫查詢可以完成任務並提高效能。

    **您修復後的程式碼:**

    export const update = async(req: Request, res: Response, next: NextFunction) => {
      try {
        const reportId = parseInt(req.params.id);
        const {
          name,
          age,
          info
        } = req.body;
    
        // 执行更新并获取受影响的行数
        const [numberOfAffectedRows] = await ReportModel.update({
          name,
          age,
          info
        }, {
          where: {
            id: reportId
          },
          // 此标志检查更新函数是否返回更新后的对象
          returning: true
        });
    
        // 检查实体是否被找到和更新
        if (numberOfAffectedRows === 0) {
          return next(new EntityNotExistError("报告不存在"));
        }
    
        // 获取更新后的报告
        const updatedReport = await ReportModel.findOne({
          where: {
            id: reportId
          }
        });
    
        return res.json({
          message: "报告已成功编辑",
          report: updatedReport
        });
    
      } catch (error) {
        return next(error);
      }
    }

    回覆
    0
  • 取消回覆