MySQL-02 NodeJS+Sequelize 操作MySQL数据库

1 基本操作

所有操作的第一个参数都是ERR,第二个参数才是操作返回的结果。

1.1 创建连接mysql.createConnection

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'zhouhao8789',
  port: '3306',
  database: 'zhou'
});

1.2 连接数据库connect

// 连接
connection.connect(function (err) {
  if (err) {
    console.log('[connection connect failed] ' + err);
    return;
  }
  console.log('[connection connect succeed]')
});

1.3 查询query+SELECT

const selectSql = 'SELECT name FROM mytable where id=1';
connection.query(selectSql, function (err, result) {
  if(err) {
    console.log('[SELECT ERROR]', err.message);
    return;
  }
  console.log('-------------------SELECT-----------------------');
  // node环境下显示返回值带有RowDataPacket
  // 用下面的方法可以显示正确的独享
  // 实际上可以使用结果对变量赋值
  console.log(JSON.parse(JSON.stringify(result)));
  console.log('------------------------------------------------------------\n\n');
});

1.4 插入query+INSERT INTO

// 插入
const addSql = 'INSERT INTO mytable(id, name, sex, birth, birtharrd) VALUES (0,?,?, ?, ?)';
const addSqlParams = ['周2', 'f', '1990-09-09', 'Beijing'];
connection.query(addSql, addSqlParams, function (err, result) {
  if(err) {
    console.log('[INSERT ERROR]', err.message);
    return;
  }
  console.log('-------------------INSERT-----------------------');
  console.log(JSON.parse(JSON.stringify(result)));
  console.log('------------------------------------------------------------\n\n');
});

1.5 修改query+UPDATE

// 修改
const modSql = 'UPDATE mytable SET name = ?, sex = ? WHERE id = ?';
const modSqlParam = ['周杰伦', 'a', 6];
connection.query(modSql, modSqlParam, function (err, result) {
  if(err) {
    console.log('[UPDATE ERROR]', err.message);
    return;
  }
  console.log('-------------------UPDATE-----------------------');
  console.log(JSON.parse(JSON.stringify(result)));
  console.log('------------------------------------------------------------\n\n');
});

1.6 删除query+DELETE

// 删除
const delSql = 'DELETE FROM mytable WHERE id = ?';
const delSqlParam = [1];
connection.query(delSql, delSqlParam, function (err, result) {
  if(err) {
    console.log('[DELETE ERROR]', err.message);
    return;
  }
  console.log('-------------------DELETE-----------------------');
  console.log(JSON.parse(JSON.stringify(result)));
  console.log('------------------------------------------------------------\n\n');
});

2 自动重连

MySQL中有一个名叫wait_timeout的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接,这个值默认为28800(即8小时)。

动重连数据库的代码:

function handleError (err) {
  if (err) {
    // 如果是连接断开,自动重新连接
    if (err.code === 'PROTOCOL_CONNECTION_LOST') {
      connect();
    } else {
      console.error(err.stack || err);
    }
  }
}

// 连接数据库
function connect () {
  db = mysql.createConnection(config);
  db.connect(handleError);
  db.on('error', handleError);
}

var db;
connect();

使用连接池:

pool.getConnection(function(err, connection) {
  // Use the connection
  connection.query( 'SELECT something FROM sometable', function(err, rows) {
    // And done with the connection.
    connection.release();

    // Don't use the connection here, it has been returned to the pool.
  });
});

另一种形式,导出一个为do的函数:

var mysql = require('mysql'),
  env = {        
    host: 'localhost',
    user: 'root',
    password: '2212',
    database: 'image_marker'      
  },
  db = mysql.createConnection(env); 

db.connect();
exports.do =function(sql, callback) {  
  db.query(sql, callback);
}

使用连接池:

var pool  = mysql.createPool(env);

exports.do =function(sql, callback) {
  this.getConnection(function(err, connection) {
    connection.query(sql, function() {
      callback.apply(connection, arguments);
      connection.release();
    });
  })
}.bind(pool)

2 使用Sequelize

上面使用的都是MySQL提供的接口,是比较底层的代码,实际上在数据库的表中,每一行都可以用一个JavaScript对象表示,这就是ORM(Object-Realtional Mapping)技术,把关系数据库的表结构映射到对象上

Sequelize就是Node上的ORM框架,这样,我们读写都是JavaScript对象,Sequelize帮我们把对象编程数据库中的行

中文文档在这里。

使用Sequelize操作的步骤

  1. 通过sequelize.define()生成一个数据模型Modal
  2. 通过Molda对象的findAll()方法获取实例
  3. 如果要更新实例,先对实例属性赋新值,然后调用save方法
  4. 删除实例调用destory()方法

2.1 sequelize对象实例

// config.js
var config = {
    database: 'test', // 使用哪个数据库
    username: 'www', // 用户名
    password: 'www', // 口令
    host: 'localhost', // 主机名
    port: 3306 // 端口号,MySQL默认3306
};

module.exports = config;

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

2.2 定义Modal映射

定义模型,告诉Sequelize如何映射到数据库表

默认情况下映射的是第一个参数加s的表,比如下面的例子就是映射的users的表,如果是与现有的数据库进行映射,则在第三个参数添加说明{ tableName: 'mytable'}

const User = sequelize.define('user', {
  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
});

2.3 查询

使用find方法,where是查询条件,attributes是输出选项

myTable.find({
  attributes: ['name', 'sex'],
  where: {
    id: 5
  }
}).then(res => {
  console.log('查询', JSON.parse(JSON.stringify(res)))
}).catch(e => {
  console.log(e)
});

2.4 添加

使用create方法

(async () => {
  try {
    const res = await myTable.create({
      name: '闹啥类',
    });
    console.log(res)
  } catch (e) {
    console.log('添加失败', e)
  }
})();

2.5 更新

更新数据时先试用find找到对应的行,然后直接对属性赋值就可以更新对应的数据

// 更新
myTable.find({
  where: {
    id: 2
  }
}).then(d => {
  d.name = '娃哈哈';
  return d.save()
}).then(res => {console.log('更新', res)});

2.6 删除

删除和更新类似,都是先用find找到对应的行(即对象),然后使用destroy方法删除数据

myTable.find({
  where: {
    id: 3
  }
}).then(d => {
  return d.destroy()
}).then(res => {console.log('删除', res)});

参考

  • http://www.runoob.com/nodejs/nodejs-mysql.html
  • https://cnodejs.org/topic/516b77e86d382773064266df
  • http://www.cnblogs.com/enix/p/3654894.html
  • https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001471955049232be7492e76f514d45a2180e2c224eb7a6000
  • http://docs.sequelizejs.com/manual/installation/getting-started

你可能感兴趣的:(数据库)