Sequelize 如何获取 AUTO_INCREMENT 下一个值?

Sequelize how to get AUTO_INCREMENT next value?

如何使用 Sequelize 获取下一个 auto_increment 值?
使用 mysql 查询:

SELECT auto_increment
FROM   information_schema.tables
WHERE  table_schema = 'skolboz'
       AND table_name = "cases";  

响应是 7,因为案例中最后插入的行是 6。

如何使用 Sequelize 实现此目的?有可能吗? 谢谢

编辑:

这是 Sequelize 模型定义:

module.exports = (sequelize, DataTypes) => {
    const Case = sequelize.define('Case', {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true,
            allowNull: false,
        },
        caseName: DataTypes.STRING,
        constructionSite: DataTypes.STRING,
        createdBy: DataTypes.STRING,
        dateOfDiscovery: { 
            type: DataTypes.DATEONLY,
            get: function() {
                return moment(this.getDataValue('dateOfDiscovery')).format('DD.MM.YYYY')
            }},
        placeOfDiscovery: DataTypes.STRING,
        responsible: DataTypes.STRING,
        text: DataTypes.TEXT,
        sanction: DataTypes.INTEGER,
        forCompany: DataTypes.STRING,
        priority: DataTypes.STRING,
        isActive: {
            type: DataTypes.INTEGER,
            defaultValue: 1,
        },
        wasSended: {
            type: DataTypes.INTEGER,
            defaultValue: 0,
        },
    })

    Case.associate = (models) => {
        Case.hasMany(models.caseimages, {foreignKey: 'id', as: 'images'});
    };
    
    return Case
}

这是创建案例并向其添加照片的控制器。

async postCaseWithImages(req, res) {
            try {
              await upload(req, res);
              console.log(req.files);
              if (req.files.length <= 0) {
                  return res.send(`Musíte vybrať aspoň 1 fotku`);
              }
            
              const uploadsFileNames = [];
              const uploadsMimeTypes = [];
              const uploadsPath = [];
    
              global.creationDate;
              global.koordinatorName;
              global.problemName;
              global.constructionName;
              global.discoveryPlace;
              global.responsible;
              global.problemText;
              global.problemSanction;
              global.adressedFor;
              global.problemPriority;
              global.problemActivity;
              global.wasSended;
              global.newCaseId;
        
              Case.create({
                caseName: req.body.caseName,
                constructionSite: req.body.constructionSite,
                createdBy: req.body.createdBy,
                dateOfDiscovery: req.body.dateOfDiscovery,
                placeOfDiscovery: req.body.placeOfDiscovery,
                responsible: req.body.responsible,
                text: req.body.text,
                sanction: req.body.sanction,
                forCompany: req.body.forCompany,
                priority: req.body.priority,
                isActive: req.body.isActive,
              })
                .then((result) => {
                  let formatedDate = moment(result.createdAt).format(
                    "DD.MM.YYYY, HH:mm:ss"
                  );
                  creationDate = formatedDate;
                  koordinatorName = result.createdBy;
                  problemName = result.caseName;
                  constructionName = result.constructionSite;
                  discoveryPlace = result.placeOfDiscovery;
                  responsible = result.responsible;
                  problemText = result.text;
                  problemSanction = result.sanction;
                  adressedFor = result.forCompany;
                  problemPriority = result.priority;
                  problemActivity = result.isActive;
                  wasSended = result.wasSended;
                  newCaseId = result.id;
                })
                .catch((err) => {
                  console.log(err);
                  res.status(500).send({
                    error: "Nepodarilo sa vytvoriť nedostatok z dôvodu: ",
                    err,
                  });
                })
                .then(() => {
                  const checkId = Case.findOne({ where: {id: newCaseId }});
    
                  if (checkId == null) {
                        res.status(400).send({ message: 'Prípad so zadaným ID sa nenašiel.'});
                        return;
                    }
    
                  for(let i=0;i<req.files.length;i++){
                    uploadsFileNames.push(req.files[i].filename);
                    uploadsMimeTypes.push(req.files[i].mimetype);
                    uploadsPath.push(req.files[i].destination);
                    CaseImage.create({
                        fileName: uploadsFileNames[i],
                        mimeType: uploadsMimeTypes[i],
                        caseId: newCaseId,
                        path: uploadsPath[i],
                    })
                }
                
                  let doc = new PDFDocument({ margin: 30, size: "A4", compress:false });
                  doc.pipe(
                    fs.createWriteStream(`pdf/${problemName}_${creationDate}` + ".pdf")
                  );
                  
                  doc.image('logo.png', 485, 10, {width: 100})
                  
                  const photosToPdf = [];
                  let positionX = 30;
                  let positionY = 240;
    
                  for(let j=0;j<uploadsPath.length;j++){
                    photosToPdf.push(uploadsFileNames[j]);
                  }
    
                  photosToPdf.forEach(img => {
                    if(positionX == 555){
                        positionX = 30
                        positionY = positionY + 160
                    }
                    doc.image(`uploads/${img}`, positionX, positionY, {width: 265});
                    positionX = positionX + 275
                  });

                const table = {
                    title: "Zápis koordinátora " + koordinatorName + "zo dna " + creationDate + ".",
                    divider: {
                        header: { disabled: false },
                        horizontal: { disabled: false, width: 0.5, opacity: 1 },
                        padding: 25,
                        columnSpacing: 20,
                    },
                    headers: [
                      { label:"Názov", property: 'name', width: 70, renderer: null },
                      { label:"Názov staveniska (stavba)", property: 'construction', width: 80, renderer: null }, 
                      { label:"Vytvoril koordinátor BOZP", property: 'createdName', width: 80, renderer: null }, 
                      { label:"Priorita", property: 'priority', width: 50, renderer: null }, 
                      { label:"Dátum zistenia", property: 'date', width: 80, renderer: null }, 
                      { label:"Zodpovedný za vyriešenie zistenia", property: 'responsible', width: 100, renderer: null },
                      { label:"Miesto zistenia", property: 'placeOfDiscovery', width: 90, renderer: null },
                    ],
                    datas: [
                      { 
                        options: { fontSize: 10, separation: true},
                        name: problemName, 
                        construction: constructionName, 
                        createdName: koordinatorName, 
                        priority: problemPriority, 
                        date: creationDate, 
                        responsible: responsible, 
                        placeOfDiscovery: discoveryPlace, 
                      },
                    ],                      
                  };

                  doc.table(table, {
                    columnSpacing: 10,
                    padding: 10,
                    columnsSize: [200,220,135],
                    align: "center",
                    prepareHeader: () => doc.font("Helvetica-Bold").fontSize(8),
                    prepareRow: (row, indexColumn, indexRow, rectRow, rectCell) => {
                        const {x, y, width, height} = rectCell;
        
                        if(indexColumn === 0){
                        doc
                            .lineWidth(.5)
                            .moveTo(x, y)
                            .lineTo(x, y + height)
                            .stroke();  
                        }
        
                        doc
                        .lineWidth(.5)
                        .moveTo(x + width, y)
                        .lineTo(x + width, y + height)
                        .stroke();
                        
                        doc.fontSize(8).fillColor('#292929');
                    },
                });

                const table2 = {
                    divider: {
                        header: { disabled: false },
                        horizontal: { disabled: false, width: 0.5, opacity: 1 },
                        padding: 25,
                        columnSpacing: 20,
                    },
                    headers: [
                      { label:"Návrh na udelenie sankcie", property: 'sanction', width: 100, renderer: null },
                      { label:"Pre spolocnost", property: 'forCompany', width: 100, renderer: null },
                      { label:"Popis problému", property: 'text', width: 350, renderer: null},
                    ],
                    datas: [
                      { 
                        options: { fontSize: 10, separation: true},
                        sanction: 50, 
                        forCompany: adressedFor, 
                        text: problemText, 
                      },
                    ],
                  };

                  doc.table(table2, {
                    columnSpacing: 10,
                    padding: 10,
                    columnsSize: [200,220,135],
                    align: "center",
                    prepareHeader: () => doc.font("Helvetica-Bold").fontSize(8),
                    prepareRow: (row, indexColumn, indexRow, rectRow, rectCell) => {
                        const {x, y, width, height} = rectCell;
        
                        if(indexColumn === 0){
                        doc
                            .lineWidth(.5)
                            .moveTo(x, y)
                            .lineTo(x, y + height)
                            .stroke();  
                        }
        
                        doc
                        .lineWidth(.5)
                        .moveTo(x + width, y)
                        .lineTo(x + width, y + height)
                        .stroke();
                        
                        doc.fontSize(8).fillColor('#292929');
                    },
                });
                doc.end();
                })
                .catch((err) => {
                  console.log(err);
                  res.status(500)
                })
                await highPriorityEmail();
                res.status(200).send({
                  message: "Nedostatok bol úspešne vytvorený.",
                });
            } catch (err) {
              console.log(err);
              res.status(500);
            }
          },

这是路线:

app.post('/api/v1/cases/:id/images',
      CaseImagesController.postCaseWithImages)

这里是Vue.js函数:

async submitCaseWithPhotos() {
        const id = this.newId;
        const bozpCaseImage = new FormData();
        bozpCaseImage.append('multi-files', this.file);
        bozpCaseImage.append('caseName', this.caseName);
        bozpCaseImage.append('constructionSite', this.$store.state.selectedConstruction);
        bozpCaseImage.append('createdBy', this.logedUser);
        bozpCaseImage.append('dateOfDiscovery', this.date);
        bozpCaseImage.append('responsible', this.responsible);
        bozpCaseImage.append('placeOfDiscovery', this.placeOfDiscovery);
        bozpCaseImage.append('text', this.text);
        bozpCaseImage.append('sanction', this.sanction);
        bozpCaseImage.append('forCompany', this.forCompany);
        bozpCaseImage.append('priority', this.priority);
        CaseImagesService.postImageWithCase(id, bozpCaseImage)
        .then((response) => {
          console.log(response)
          this.$router.push({ name: 'Cases' });
        })
      .catch((error) => {
        console.log(error)
        this.error = "Failed to submit data - please try again later.";
        });
    },

当我得到 this.newId:

时,这是函数
async getNewCaseId(){
      CasesService.index()
      .then((response) => {
        const resData = response.data;
        const responseArray = []
        responseArray.push(resData);
        const arrayLength = responseArray[0].length;
        const lastId = responseArray[0][arrayLength - 1].id
        const newId = lastId + 1
        console.log(newId);
        this.newId = newId;
      })
    }

这是工作,更新的功能。

  async postCaseWithImages(req, res) {
    try {
      await upload(req, res);
      console.log(req.files);
      if (req.files.length <= 0) {
          return res.send(`Musíte vybrať aspoň 1 fotku`);
      }
    
      const uploadsFileNames = [];
      const uploadsMimeTypes = [];
      const uploadsPath = [];

      global.newCaseId;
      global.creationDate;
      global.koordinatorName;
      global.problemName;
      global.constructionName;
      global.discoveryPlace;
      global.responsible;
      global.problemText;
      global.problemSanction;
      global.adressedFor;
      global.problemPriority;
      global.problemActivity;
      global.wasSended;
      global.emailGroup;
      
      Case.create({
        caseName: req.body.caseName,
        constructionSite: req.body.constructionSite,
        createdBy: req.body.createdBy,
        dateOfDiscovery: req.body.dateOfDiscovery,
        placeOfDiscovery: req.body.placeOfDiscovery,
        responsible: req.body.responsible,
        text: req.body.text,
        sanction: req.body.sanction,
        forCompany: req.body.forCompany,
        priority: req.body.priority,
        isActive: req.body.isActive,
        mailingListGroup: req.body.mailingListGroup,
      })
        .then((result) => {
          let formatedDate = moment(result.createdAt).format(
            "DD.MM.YYYY, HH:mm:ss"
          );
          newCaseId = result.id;
          creationDate = formatedDate;
          koordinatorName = result.createdBy;
          problemName = result.caseName;
          constructionName = result.constructionSite;
          discoveryPlace = result.placeOfDiscovery;
          responsible = result.responsible;
          problemText = result.text;
          problemSanction = result.sanction;
          adressedFor = result.forCompany;
          problemPriority = result.priority;
          problemActivity = result.isActive;
          wasSended = result.wasSended;
          emailGroup = result.mailingListGroup;
        })
        .catch(() => {
          console.log(err);
          res.status(500).send({
            error: "Nepodarilo sa vytvoriť nedostatok z dôvodu: ",
            err,
          });
        })
        .then(async () => {
          const checkId = Case.findOne({ where: {id: newCaseId }});

          if (checkId == null) {
                res.status(400).send({ message: 'Prípad so zadaným ID sa nenašiel.'});
                return;
            }

          for(let i=0;i<req.files.length;i++){
            uploadsFileNames.push(req.files[i].filename);
            uploadsMimeTypes.push(req.files[i].mimetype);
            uploadsPath.push(req.files[i].destination);
            CaseImage.create({
                fileName: uploadsFileNames[i],
                mimeType: uploadsMimeTypes[i],
                caseId: newCaseId,
                path: uploadsPath[i],
            })
          }
          let doc = new PDFDocument({ margin: 30, size: "A4", compress:false });
          doc.pipe(
            fs.createWriteStream(`pdf/${problemName}_${creationDate}` + ".pdf")
          );
          
          doc.image('Skolboz_bez_pozadia.png', 500, 25, {width: 100})
          
          const photosToPdf = [];
          let positionX = 30;
          let positionY = 240;

          for(let j=0;j<uploadsPath.length;j++){
            photosToPdf.push(uploadsFileNames[j]);
          }

          photosToPdf.forEach(img => {
            if(positionX >= 550){
                positionX = 30
                positionY = positionY + 215
            }
            doc.image(`uploads/${img}`, positionX, positionY, {width: 265});
            positionX = positionX + 275
          });

          const table = {
            title: "Zápis koordinátora " + koordinatorName + " zo dna " + creationDate + ".",
            divider: {
                header: { disabled: false },
                horizontal: { disabled: false, width: 0.5, opacity: 1 },
                padding: 25,
                columnSpacing: 20,
            },
            headers: [
              { label:"Názov", property: 'name', width: 70, renderer: null },
              { label:"Názov staveniska (stavba)", property: 'construction', width: 80, renderer: null }, 
              { label:"Vytvoril koordinátor BOZP", property: 'createdName', width: 80, renderer: null }, 
              { label:"Priorita", property: 'priority', width: 50, renderer: null }, 
              { label:"Dátum zistenia", property: 'date', width: 80, renderer: null }, 
              { label:"Zodpovedný za vyriešenie zistenia", property: 'responsible', width: 100, renderer: null },
              { label:"Miesto zistenia", property: 'placeOfDiscovery', width: 90, renderer: null },
            ],
            datas: [
              { 
                options: { fontSize: 10, separation: true},
                name: problemName, 
                construction: constructionName, 
                createdName: koordinatorName, 
                priority: problemPriority, 
                date: creationDate, 
                responsible: responsible, 
                placeOfDiscovery: discoveryPlace, 
              },
            ],                      
          };

          doc.table(table, {
            columnSpacing: 10,
            padding: 10,
            columnsSize: [200,220,135],
            align: "center",
            prepareHeader: () => doc.font("Helvetica-Bold").fontSize(8),
            prepareRow: (row, indexColumn, indexRow, rectRow, rectCell) => {
                const {x, y, width, height} = rectCell;

                if(indexColumn === 0){
                doc
                    .lineWidth(.5)
                    .moveTo(x, y)
                    .lineTo(x, y + height)
                    .stroke();  
                }

                doc
                .lineWidth(.5)
                .moveTo(x + width, y)
                .lineTo(x + width, y + height)
                .stroke();
                
                doc.fontSize(8).fillColor('#292929');
            },
        });

          const table2 = {
            divider: {
                header: { disabled: false },
                horizontal: { disabled: false, width: 0.5, opacity: 1 },
                padding: 25,
                columnSpacing: 20,
            },
            headers: [
              { label:"Návrh na udelenie sankcie", property: 'sanction', width: 100, renderer: null },
              { label:"Pre spolocnost", property: 'forCompany', width: 100, renderer: null },
              { label:"Popis problému", property: 'text', width: 350, renderer: null},
            ],
            datas: [
              { 
                options: { fontSize: 10, separation: true},
                sanction: 50, 
                forCompany: adressedFor, 
                text: problemText, 
              },
            ],
          };

          doc.table(table2, {
            columnSpacing: 10,
            padding: 10,
            columnsSize: [200,220,135],
            align: "center",
            prepareHeader: () => doc.font("Helvetica-Bold").fontSize(8),
            prepareRow: (row, indexColumn, indexRow, rectRow, rectCell) => {
                const {x, y, width, height} = rectCell;

                if(indexColumn === 0){
                doc
                    .lineWidth(.5)
                    .moveTo(x, y)
                    .lineTo(x, y + height)
                    .stroke();  
                }

                doc
                .lineWidth(.5)
                .moveTo(x + width, y)
                .lineTo(x + width, y + height)
                .stroke();
                
                doc.fontSize(8).fillColor('#292929');
            },
          });
          doc.end();
          await highPriorityEmail(emailGroup);
        })
        .catch((err) => {
          console.log(err);
          res.status(500)
        })
        .then(() => {
          res.status(200).send({
            message: "Nedostatok bol úspešne vytvorený.",
          });
        })
    } catch (err) {
      console.log(err);
      res.status(500);
    }
  },

这里还有新的 HighPriorityEmail() 函数,它现在获取参数。

function highPriorityEmail(emailGroup){
  return new Promise((resolve, reject) => {
    setTimeout(async () => {
      const emailAdress = await getEmails(emailGroup);
      let filePath = path.join(__dirname, `../../pdf/${problemName}_${creationDate}.pdf`);
      let attachment = fs.readFileSync(filePath).toString("base64");
      let fileName = `${problemName}_${creationDate}.pdf`;

      if (problemPriority == "vysoká") {
        const msg = {
          to: emailAdress, // Change to your recipient
          from: "someone@example.com"
          subject: "Vytvorenie nového nedostatku: " + problemName,
          html: `
                        Dobrý deň, <br>
                        <br>
                        dňa ${creationDate} bol vykonaný dozor koordinátora ${koordinatorName}. <br> 
                        Boli zistené nedostatky s vysokou prioritou, ktoré sú priložené v prílohe tohoto emailu.
                        <br>
                    `,
          attachments: [
              {
                  content: attachment,
                  filename: fileName,
                  type:'application/pdf'
              },
          ],
        };
        
        sgMail
          .send(msg)
          .then(() => {
            console.log("Email sent");
          })
          .catch((error) => {
            console.error(error);
          });

        Case.update(
          { wasSended: 1 },
          { returning: true, where: { caseName: problemName } }
        );
      }
      resolve();
    }, 1000)
  });
};

最后是 getEmails() 函数。

async function getEmails (emailGroup){
  const groupResponse = await MailingListGroup.findAll({ where: { mailingListGroup: emailGroup }})
  let gropudId = JSON.stringify(groupResponse[0].id);

  const emailsResponse = await MailingListEmails.findAll({ where: { mailingListGroup: gropudId }})
  const emails = [];
  for(let i=0; i<emailsResponse.length; i++){
    emails.push(emailsResponse[i].email);
  }
  return emails;
}