Maison  >  Questions et réponses  >  le corps du texte

Optimiser les transactions SQL dans l'API

<p>J'ai eu un entretien d'embauche récemment et j'ai reçu quelques devoirs. Ensuite, j'ai reçu un retour indiquant que j'avais une combinaison inutile de requêtes et de transactions dans mon point de terminaison de mise à jour. </p> <pre class="brush:php;toolbar:false;">export const update = async (req : demande, res : réponse, suivant : NextFunction) => essayer { const reportId = parseInt (req.params.id) const { nom, âge, informations } = req.body const rapport = attendre ReportModel.findOne ({ où: { identifiant : identifiant du rapport } }) if (!report) return next(new EntityNotExistError("Le rapport n'existe pas")) attendre ReportModel.update({ nom, âge, Info }, { où: { identifiant : identifiant du rapport } }) const _report = attendre ReportModel.findOne ({ où: { identifiant : identifiant du rapport } }) retourner res.json({ message : "Rapport modifié avec succès", rapport : _rapport }) } attraper (erreur) { revenir ensuite (erreur) } }</pré> <p>Comme vous pouvez le voir, la première requête vérifie si l'entité existe, puis j'effectue une mise à jour sur l'entité et la dernière requête renvoie l'entité mise à jour. Existe-t-il un moyen d'optimiser la communication avec la base de données ? </p>
P粉343408929P粉343408929407 Il y a quelques jours429

répondre à tous(1)je répondrai

  • P粉201448898

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

    Votre code implique trois interactions différentes avec la base de données pour une seule opération de mise à jour :

    1. Vérifiez si l'entité existe | Code : ReportModel.findOne()
    2. Mettre à jour le code de l'entité : ReportModel.update()
    3. Obtenir l'entité mise à jour à renvoyer dans la réponse Code : ReportModel.findOne()

    La réduction des requêtes de base de données fait le travail et améliore les performances.

    **Votre code fixe :**

    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);
      }
    }

    répondre
    0
  • Annulerrépondre