Sequelize 'upsert' не работает должным образом - PullRequest
0 голосов
/ 19 марта 2019

Небольшой фон

Ну, я пытался использовать команду upsert, однако я продолжаю получать ошибки, и я понятия не имел, что пошло не так, я уже ввел object, который я хочу upsert (то есть NewIssue), значение которого основано на другом вызове.

Что он делает
Ошибка: (

{
    "name": "SequelizeDatabaseError",
    "parent": {
        "fatal": false,
        "errno": 1064,
        "sqlState": "42000",
        "code": "ER_PARSE_ERROR",
        "sql": "INSERT INTO `ms_issue` VALUES () ON DUPLICATE KEY UPDATE ;"
    },
    "original": {
        "fatal": false,
        "errno": 1064,
        "sqlState": "42000",
        "code": "ER_PARSE_ERROR",
        "sql": "INSERT INTO `ms_issue` VALUES () ON DUPLICATE KEY UPDATE ;"
    },
    "sql": "INSERT INTO `ms_issue` VALUES () ON DUPLICATE KEY UPDATE ;"
}

Мой код

Схема данных:

const Issue = sequelize.define('ms_issue', {
    id_Issue: {
        type: Sequelize.NUMBER,
        primaryKey: true
    },
    id_IssueTag: {
        type: Sequelize.NUMBER,
    },
    datetime_Issued: {
        type: Sequelize.NOW
    },
    subject_Issue: {
        type: Sequelize.STRING
    },
    desc_Issue: {
        type: Sequelize.STRING
    },
    status_Issue: {
        type: Sequelize.STRING
    }
}, { timestamps: false, freezeTableName: true });
app.put('/issues/:id', (req, res) => {
  const id_Staff = req.body.id_Staff
  if (typeof id_Staff !== 'undefined' && typeof id_Staff === 'number') {
    const id_Issue = parseInt(req.params.id)
    if (typeof id_Issue !== 'undefined' && typeof id_Issue === 'number') {
      Issue.findByPk(id_Issue)
        .then(issue => {
          if (issue) {
            const newIssue = {
              subject_Issue: req.body.subject || undefined,
              desc_Issue: req.body.description || undefined,
              id_IssueTag: req.body.tag || undefined
            }
            for (const obj in newIssue) {
              if (typeof newIssue[obj] !== 'undefined') {
                issue[obj] = newIssue[obj]
              }
            }
            const NewIssue = issue
            return NewIssue
          } else res.status(404).send("Issue not found")
        })
        .then(NewIssue => {
          return Issue.upsert(NewIssue)
            .then(bool => {
              if (bool === true) {
                res.status(200).send("Issue has been updated")
                res.status(200).send(NewIssue)
              }
            })
            .catch(err => {
              res.status(500).send(err)
            })
        })
        .catch(err => {
          console.log(err)
          res.status(500).send("Cannot connect to database")
        })
    } else {
      res.status(400).send("Invalid parameters: require 'id_Issue'")
    }
  } else {
    res.status(401).send("Unauthorized access")
  }
})

Что я хотел
Возможность вставки / обновления по запросу в MariaDB. И объяснение:)

1 Ответ

0 голосов
/ 19 марта 2019

Сгенерированный SQL недопустим - нет значений:

"sql": "INSERT INTO `ms_issue` VALUES () ON DUPLICATE KEY UPDATE ;"

SQL должен быть действительным, если вы укажете, примерно так, как показано ниже:

...
Issue.upsert({
    id_Issue:  id_Issue,
    subject_Issue: NewIssue.subject_Issue, 
    id_IssueTag : NewIssue.id_IssueTag,
...
...