简体   繁体   English

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

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

I'm trying to build an app where an user can registry/login and save his favorites movies.我正在尝试构建一个应用程序,用户可以在其中注册/登录并保存他最喜欢的电影。 Here's the database这是数据库

在此处输入图片说明

This is my first project using MySQL and i found it hard at first to insert/get data for authentification but i managed to do it.这是我使用 MySQL 的第一个项目,我发现一开始很难插入/获取数据以进行身份​​验证,但我设法做到了。

Now i'm trying to have a form where the user can insert movies, but i'm not sure how to do it, since i think i need to have multiple insert queries for : movies directors, user_movies...现在我正在尝试创建一个用户可以插入电影的表单,但我不知道该怎么做,因为我认为我需要对以下内容进行多个插入查询:电影导演、user_movies...

What i tried :我试过的:

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 provides a good approach to solving this with the use of Stored Procedures. @Luuk 提供了一种使用存储过程解决此问题的好方法。 That can be helpful and efficient particularly when you need a newly created value from insert_1 to be used in insert_2 for example.例如,当您需要将insert_1新创建的值用于insert_2 ,这会很有帮助且有效。

In your question you appear to already have all of the data your queries require.在您的问题中,您似乎已经拥有查询所需的所有数据。

If you would like to accomplish this entirely within your Node app and not use a stored procedure, you can do so by enabling the multipleStatements config option .如果您想完全在您的Node应用程序中完成此操作而不使用存储过程,您可以通过启用multipleStatements配置选项来实现

An example is included below based on your sample code.下面包含一个基于您的示例代码的示例。 In the first line of the connection config you will see where the multipleStatements: true is defined.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});
    });
  }
);

Be aware that support for multiple statements comes with increased security risks such as SQL injection attacks.请注意,支持多个语句会增加安全风险,例如 SQL 注入攻击。 Always be diligent to ensure values are properly escaped.始终努力确保正确转义值。

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

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