node连接MySQL

1 .通过 mysql的 createConnection方式

安装mysql

yarn add mysql 
或者
npm install mysql

1.1 连接数据库

const mysql = require("mysql");
//createConnection方法创建连接对象
//正式的说法是 使用createConnection方法创建一个表示与mysql数据库服务器之间连接的connection对象

/*建立数据库链接  连接配置 */
var conn = mysql.createConnection({
  host:'127.0.0.1',
  user: 'root',
  password: 'root',  // 修改为你的密码
  port: '3306',
  database: 'd20200115'  // 请确保数据库存在
});

 // 连接
 conn.connect((err) => {
  if(err) {
      throw(err);
  }
  console.log('数据库连接成功!')
})

1.2 操作数据库

// 查询 conn.query()
// 创建表
const CREATE_SQL = `CREATE TABLE IF NOT EXISTS test (
                    id INT NOT NULL AUTO_INCREMENT,
                    username VARCHAR(45) NULL,
                    age INT NULL,
                    message VARCHAR(45) NULL,
                    PRIMARY KEY (id))`;
const INSERT_SQL = `INSERT INTO test(username,age,message) VALUES(?,?,?)`;  // 使用占位符
const SELECT_SQL = `SELECT * FROM test`;
conn.query(CREATE_SQL, (err, data) => {
  if (err) {
    throw err;
  }
  // 插入数据
  conn.query(INSERT_SQL, ['song','10',"hello,world"], (err, result) => {
    if (err) {
      throw err;
    }
    console.log(result);
    conn.query(SELECT_SQL, (err, results) => {
        console.log(JSON.stringify(results));
        conn.end(); // 若query语句有嵌套,则end需在此执行
    })
  });
});

2 .通过mysql 的 createPool连接

  • createPool连接池
    连接池有助于减少连接到MySQL服务器的时间,通过重用以前的连接
    可以避免查询的延迟,减少建立新连接所带来的开销。

在开发web应用程序时,连接池是一个很重要的概念。建立一个数据库连接所消耗的性能成本是很高的。在服务器应用程序中,如果为每一个接收到的客户端请求都建立一个或多个数据库连接,将严重降低应用程序性能。

因此在服务器应用程序中通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,从连接池中取出连接并重新利用,而不需要再重新建立连接。

//createPool
var pool = mysql.createPool(optioins);

options参数包含createConnection方法中可以使用的各种属性

//getConnection
//err为错误对象,connection为获取到的连接对象。
从连接池中取出连接。

//可以获取到连接对象 操作后建议主动的释放连接
pool.getConnection(function(err,connection))

//release
release方法将其归还到连接池中

connection.release();

//destroy
当一个连接不再需要使用且需要从连接池中移除时用connection对象的destroy方法。

connection.destroy(); 

连接移除后,连接池中的连接数减一

//end
当一个连接池不再需要使用时,用连接池对象的end方法关闭连接池。

pool.end();

2.1 mysql连接数据库

const mysql = require('mysql');
// options参数包含createConnection方法中可以使用的各种属性
const pool = mysql.createPool({
    host:'127.0.0.1',
    user: 'root',
    password: 'root',  // 修改为你的密码
    port: '3306',
    database: 'ruanmoutest'  // 请确保数据库存在
});

2.2 操作数据库 ,同上

const CREATE_SQL = `CREATE TABLE IF NOT EXISTS test (
    id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(45) NULL,
    age INT NULL,
    message VARCHAR(45) NULL,
    PRIMARY KEY (id))`;
const INSERT_SQL = `INSERT INTO test(username,age,message) VALUES(?,?,?)`;  // 使用占位符
const SELECT_SQL = `SELECT * FROM test`;

pool.getConnection(function(err,conn){
    if (err) {
        throw(err);
    }

      // 插入数据
    conn.query(INSERT_SQL, ['laney','20',"test"], (err, result) => {
        if (err) {
            throw err;
        }
        console.log(result);
        conn.query(SELECT_SQL, (err, results) => {
            console.log(JSON.stringify(results));
            conn.end(); // 若query语句有嵌套,则end需在此执行
            // conn.release();  //释放连接
        })
    });

})

3 . 通过mysql2连接

mysql2 是mysql的一个扩展

安装:

yarn add mysql2
或者
npm install mysql2

如果你希望 用链式结构写数据库连接, 可以选择 mysql2, 其他用法基本和mysql的使用一样

(async () => {
     // mysql2 是mysql的一个扩展
   const mysql = require('mysql2/promise')

   // 连接配置
   const cfg = {
       host:'127.0.0.1',
       user: 'root',
       password: 'root',  // 修改为你的密码
       port: '3306',
       database: 'ruanmoutest'  // 请确保数据库存在
   }

   const connection = await mysql.createConnection(cfg)

   let ret = await connection.execute(`
       CREATE TABLE IF NOT EXISTS test (
           id INT NOT NULL AUTO_INCREMENT,
           message VARCHAR(45) NULL,
       PRIMARY KEY (id))
   `)
   console.log('create', ret)
   })()  

4. mysql 连接 通过 sequelize

安装:

yarn add sequelize
或者
npm install sequelize

第一步:创建一个sequelize对象实例:


const Sequelize = require('sequelize');

var sequelize = new Sequelize(config.database, config.username, config.password, {
   host: config.host,
   dialect: 'mysql',
   pool: {
       max: 5,
       min: 0,
       idle: 30000
   }
});

第二步,定义模型Pet,告诉Sequelize如何映射数据库表:

var Pet = sequelize.define('pet', {
   id: {
       type: Sequelize.STRING(50),
       primaryKey: true
   },
   name: Sequelize.STRING(100),
   gender: Sequelize.BOOLEAN,
   birth: Sequelize.STRING(10),
   createdAt: Sequelize.BIGINT,
   updatedAt: Sequelize.BIGINT,
   version: Sequelize.BIGINT
}, {
       timestamps: false
   });

用sequelize.define()定义Model时,传入名称pet,默认的表名就是pets。第二个参数指定列名和数据类型,如果是主键,需要更详细地指定。第三个参数是额外的配置,我们传入{ timestamps: false }是为了关闭Sequelize的自动添加timestamp的功能。所有的ORM框架都有一种很不好的风气,总是自作聪明地加上所谓“自动化”的功能,但是会让人感到完全摸不着头脑。

示例代码:

(async () => {
    const Sequelize = require('sequelize');
    const sequelize = new Sequelize('d20200115', 'root', '123456', {
        host: '127.0.0.1',
        dialect: 'mysql',
        operatorsAliases: false
    })

    const Fruit = sequelize.define('Fruit', {
        name: {
            type: Sequelize.STRING(20),
            allowNull: false
        },
        price: {
            type: Sequelize.FLOAT,
            allowNull: false
        }
    }, {
        timestamps: false
    });
    Fruit.prototype.totalPrice = function (count) {
        return (this.price * count).toFixed(2);
    };
    // let ret = await Fruit.sync({force:false})
    // ret = await Fruit.create({
    //     name: "香蕉",
    //     price: 3.5
    // })

    // ret = await Fruit.create({
    //     name: "西瓜",
    //     price: 20
    // })

    // ret2 = await Fruit.findAll()
    // console.log(ret2);
    // 使用实例方法
    // Fruit.findAll().then(fruits => {
    //     const [f1] = fruits;
    //     console.log(fruits);

    //     fruits.forEach((option, index) => {
    //         // console.log(option);
    //     })
    //     console.log(`买5kg${f1.name}需要¥${f1.totalPrice(5)}`);
    // });

    //找出某一个水果
    Fruit.findOne({ where: { name: "香蕉" } }).then(fruit => {
        // fruit是首个匹配项,若没有则为null
        console.log(fruit.get());
    });

    // console.log('findAll', ret.amount, JSON.stringify(ret))
})()

你可能感兴趣的:(node)