node.js使用Sequelize 操作mysql

歸去來兮-不如去兮發表於2018-07-18

Sequelize就是Node上的ORM框架 ,相當於java端的Hibernate

是一個基於 promise 的 Node.js ORM, 目前支援 Postgres, MySQL, SQLite 和 Microsoft SQL Server. 它具有強大的事務支援, 關聯關係, 讀取和複製等功能.

首先看一下在node上面使用原生mysql

npm install mysql –save

進入資料庫 create database greet 建立資料庫

/config/defaut

let config = {
  port: 3000,
  database: {
    host: `127.0.0.1`,          //根據當前環境填寫
    port: 3306,
    user: `root`,
    password: `000000`,
    database: `greet`
  }
}
module.exports = config;

Schema/mysql.js

let mysql = require(`mysql`);
let config = require(`../config/defaut`);  //這是配置資訊

let connection = mysql.createConnection({    //連結資料庫
  host: config.database.host,
  port: config.database.port,
  user: config.database.user,
  password: config.database.password,
  database: config.database.database
})

connection.connect(err => {                   //判斷時候連結資料庫
  if (err) {
    console.log("mysql is fail" + err);
    return;
  }
  console.log("mysql is success!"); //資料庫連結成功標誌
})

let select = "select * from users";             //檢視時候有user這個表
connection.query(select, (err, done) => {
  if (done == undefined) { //建立之前進行判斷 建立使用者表
    let createUser = `
          create table if not exists users(
          user_id INT NOT NULL AUTO_INCREMENT,
          user_name VARCHAR(20) NOT NULL,
          user_password VARCHAR(20) NOT NULL,
          user_PhoneNumber VARCHAR(20) NOT NULL,
          PRIMARY KEY(user_id)
        )`
    connection.query(createUser, (err, result) => { //建立資料庫表
      if (err) {
        console.error("create is err" + err);
        return;
      }
      console.log(`create is success`, result); //建立成功就返回建立的表
    })
  } else {
    console.log("表已經存在,query程式碼不再載入");
  }
})

module.exports = connection;



let addusers = `insert into  users (user_id,user_name,user_password,user_PhoneNumber) values (?,?,?,?)`;
    let addusersSql = [, `張三`, `000000`, `11111111111`];
    connection.query(addusers, addusersSql, (err, done) => {
      if (err) {
        console.log("[insert into is error]" + err.message);
        return;
      }
      console.log("-------------------------insert-----------------------------");
      console.log("Id to", done.insertId);
    })

因為是原生的sql語句操作,顯得很麻煩,Sequelize 就出現了

在資料庫的表中,每一行都可以用一個JavaScript物件表示,這就是ORM(Object-Realtional Mapping)技術,把關聯式資料庫的表結構對映到物件上

npm install sequelize –save

npm install mysql2 –save

因為 Sequelize 不能建立資料庫,所以需要手動建立一個資料庫:

create database greet

Schema/mysql.js

let config = require(`../config/defaut`);  //資料庫配置
let Sequelize = require(`sequelize`);
// new Sequelize(database, [username=null], [password=null], [options={}])
// class Sequelize 接收 4 個引數,後三個引數是可選的

let sequelize = new Sequelize(config.database.database, config.database.user, config.database.password,{
  host: config.database.host,
  dialect: `mysql`,
  pool: {
    max: 3,       //連線池最大連結數量
    min: 1,       //連線池最小連結數量
    idle: 10000   //執行緒10秒內沒有被操作就會釋放執行緒
  }
})


sequelize.authenticate() //連線測試
.then(()=> {
  console.log("mysql is Success");
})
.catch (err=> {
  console.log(err);
})

module.exports = sequelize;

下面我們建立表

let mysql = require(`./mysql`);  //Sequelize 的資料庫配置
let Sequelize = require(`sequelize`);

let Users = mysql.define(`user`, {
  user_name: {                  //建立表欄位
    type: Sequelize.STRING(100),    //Sequelize.String型別 引數不清楚什麼 貌似是欄位長度 不寫也行
    //type: Sequelize.STRING,
    field: `user_name` // 指定儲存在表中的鍵名稱
    // 沒有指定 field,表中鍵名稱則與物件鍵名相同,為 user_name
  },
  user_password: {
    type: Sequelize.STRING(50)
  },
  user_PhoneNumber: {
    type: Sequelize.STRING(50)
  }
}, {
  // 如果為 true 則表的名稱和 model 相同,即 user
  // 為 false MySQL 建立的表名稱會是複數 users
  // 如果指定的表名稱本就是複數形式則不變
  freezeTableName: false
});

// 建立表
// User.sync() 會建立表並且返回一個 Promise 物件
// 如果 force = true 則會把存在的表(如果 users 表已存在)先銷燬再建立表
// 預設情況下 force = false
Users.sync({
  force: false 
}).then(() => {
  console.log("[Users is success]");
})
//新增使用者
Users.create({
    user_name: "張三",
    user_password: "000000",
    user_PhoneNumber: "138138138138"
})


//檢視使用者
let lookUser = async () => {
  //return await Users.findAll()         //返回一個查詢的promise物件
    await Users.findAll().then(res => {
        console.log(JSON.parse(JSON.stringify(res)))  //檢視資料庫裡面的全部欄位
    })
}

module.exports = {
  addUSers,
  userlogin,
  lookUser
}

在專案裡面的具體引用請看我的github

相關文章