繁体   English   中英

如何使用 node.js 插入多个 mysql 查询?

[英]How to insert multiple mysql queries using node.js?

我正在尝试构建一个应用程序,用户可以在其中注册/登录并保存他最喜欢的电影。 这是数据库

在此处输入图片说明

这是我使用 MySQL 的第一个项目,我发现一开始很难插入/获取数据以进行身份​​验证,但我设法做到了。

现在我正在尝试创建一个用户可以插入电影的表单,但我不知道该怎么做,因为我认为我需要对以下内容进行多个插入查询:电影导演、user_movies...

我试过的:

app.post("/add", (req, res) => {

const userId = req.body.userId;
const title = req.body.title;
const year = req.body.year;
const image_url = req.body.image_url;
const runtime = req.body.runtime;
const rating = req.body.rating;
const director = req.body.director;
const genre = req.body.genre;
const description = req.body.description;

    db.query('insert into movies (title, year,image_url,runtime, rating, description)values(?, ?,?,?,?,?)',
        [title, year, image_url, runtime, rating, description], (err, result) => {
            console.log(err);
            res.send(result);
        }
    )
    db.query('insert into directors (name) values(?)',
        [director], (err, result) => {
            console.log(err);
            res.send(result);
    });
    db.query('insert into genres (name) values(?)',
        [genre], (err, result) => {
            console.log(err);
            res.send(result);
    });
});

})

@Luuk 提供了一种使用存储过程解决此问题的好方法。 例如,当您需要将insert_1新创建的值用于insert_2 ,这会很有帮助且有效。

在您的问题中,您似乎已经拥有查询所需的所有数据。

如果您想完全在您的Node应用程序中完成此操作而不使用存储过程,您可以通过启用multipleStatements配置选项来实现

下面包含一个基于您的示例代码的示例。 connection配置的第一行中,您将看到multipleStatements: true的定义位置。

const mysql = require('mysql');

const connection = mysql.createPool({
  multipleStatements: true, // required for multiple statements
  connectionLimit: 10,
  host: process.env.DB_HOST || '127.0.0.1',
  user: process.env.DB_USER || 'local_user',
  password: process.env.DB_PASSWORD || 'local_password',
  database: process.env.DB_NAME || 'local_database',
  charset: 'utf8mb4' // necessary if you might need support for emoji characters
});

const db = connection;

app.post("/add", (req, res) => {
  let userId = req.body.userId;
  let title = req.body.title;
  let year = req.body.year;
  let image_url = req.body.image_url;
  let runtime = req.body.runtime;
  let rating = req.body.rating;
  let director = req.body.director;
  let genre = req.body.genre;
  let description = req.body.description;

  let query_1 = `INSERT INTO movies (title, year, image_url, runtime, rating, description) VALUES (?, ?, ?, ?, ?, ?); `;
  let query_2 = `INSERT INTO directors (name) VALUES (?); `;
  let query_3 = `INSERT INTO genres (name) VALUES (?);`;

  db.query(
    query_1 + query_2 + query_3, 
    [title, year, image_url, runtime, rating, description, director, genre], 
    (err, results, fields) => {
      if (error) throw error;
      // results is an array with one element for every statement in the query:
      console.log(results[0]); // query_1 results
      console.log(results[1]); // query_2 results
      console.log(results[2]); // query_3 results
      res.send({all_result: results});
    });
  }
);

请注意,支持多个语句会增加安全风险,例如 SQL 注入攻击。 始终努力确保正确转义值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM