【问题标题】:Node js SQL Transactions REST节点 js SQL 事务 REST
【发布时间】:2020-03-21 17:48:20
【问题描述】:

我已经使用 express.js 实现了一个 REST API。我用它来连接我的数据库。数据库必须有表。一个是表格 Person,另一个叫做 Pet。

app.post('/persons', (req, res, next) => {

let firstname = req.body.firstname;
let lastname = req.body.lastname;
let petname = req.body.petname;

if (!firstname) {
    return res.status(400).send({ error: true, message: 'Please provide first name' });
}else if (!lastname) {
    return res.status(400).send({ error: true, message: 'Please provide last name' });
}else if (!petname) {
    return res.status(400).send({ error: true, message: 'Please provide pet name' });
}

当我调用这个 post 方法时,我想检查某个 petname 是否已经存在于数据库中。如果是这样,则获取 petID 并将其与名字和姓氏一起插入到 Person 表中,以便将人与宠物链接起来。如果此宠物名不存在,则在表 Pet 中创建一个具有此名称和新 id 的新宠物。然后再次将 id 和名字和姓氏保存到表 Person 中。所以每个宠物名应该只存在一次。

我知道如何将 Person 写入数据库:

Conn.query("INSERT INTO Person SET ? ", { FirstName: firstname, LastName: lastname, PetID: petid }, function (error, results, fields) {
        if (error) throw error;
        return res.send({ error: false, data: results, message: 'New person has been created successfully.' });
    });

但是现在我仍然需要 petID,如果有的话,如果没有的话,在数据库中创建一个新的宠物并返回 id。 我该怎么做?

【问题讨论】:

    标签: sql node.js


    【解决方案1】:

    所以我尝试了这个,但它不起作用。

    Conn.beginTransaction(function(error){
        if (error) throw error;
        Conn.query('Select PetID FROM Pet WHERE Petname = ' + mysql.escape(petname), function (error, results, fields){
            if (error) { 
                connection.rollback(function() {
                    throw error;
                });
            }
            else {
                if (!results) {
                    Conn.query('INSERT INTO Pet SET ? ', { Petname: petname }, function (error, results, fields){
                        if (error) { 
                            connection.rollback(function() {
                              throw err;
                            });
                        }
                        return res.send({ error: false, data: results, message: 'New pet has been created successfully.' });
                    });
                }
                let petid = results.insertId;
    
                Conn.query('INSERT INTO Person SET ? ', { FirstName: firstname, LastName: lastname, PetID: petid}, function (error, results, fields){
                    if (error) { 
                        connection.rollback(function() {
                          throw error;
                        });
                      }
                    Conn.commit;  
                    return res.send({ error: false, data: results, message: 'New person has been created successfully.' });    
                });
            }
        });
    });
    

    这笔交易有什么问题?

    【讨论】:

      【解决方案2】:

      我认为在创建交易之前检查是您的选择。

      如果宠物存在,您将获得它的 id,如果不存在 - 创建新宠物并获得 id。

      我为psql写了一个小sql脚本:

      WITH pet AS (
      WITH new_row AS (
      INSERT INTO Pets (id)
      SELECT '{id}' WHERE NOT EXISTS (SELECT * FROM Pets WHERE id = '{id}')
      RETURNING *
      )
      
      SELECT * FROM new_row
      UNION
      SELECT * FROM Pets WHERE id = '{id}' LIMIT 1
      RETURNING *
      )
      
      INSERT INTO Person SET pet_id=pet.id;
      

      SOURCE FROM RELATED QUESTION

      下一步是为人员创建交易。现在你已经有了你的宠物ID。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2016-06-12
        • 2018-01-20
        • 2022-01-03
        • 2018-09-25
        • 2012-02-08
        • 2014-05-18
        相关资源
        最近更新 更多