1. 程式人生 > >Node.js ORM_Sequelize學習

Node.js ORM_Sequelize學習

Node.js ORM_Sequelize 學習記錄1

說明

只是單純的記錄學習過程
##Sequelize
是一個基於 promise 的 Node.js ORM, 目前支援 Postgres, MySQL, SQLite 和 Microsoft SQL Server. 它具有強大的事務支援, 關聯關係, 讀取和複製等功能
官方中文文件

環境說明

本次學習使用的:
mysql5.6
Node.js 8.9.3
npm 5.5.1

安裝sequelize模組及MySQL2

$ npm init 
$ npm install --save sequelize

$ npm install --save mysql2

建立連線

我們首先建立一個db.js
建立類的目的:更好的分層
db負責和資料庫互動
實體類負責和db互動
service負責呼叫實體類的方法來處理邏輯

./db.js
/*我們首先引入sequelize模組*/
const Sequelize = require('sequelize');
class Db {
    sequelize(){
    	/* 引數 database username password */
let sequelize = new Sequelize('orm','root','123456',{ host: 'localhost', //資料庫地址 dialect: 'mysql', //指定資料庫 //operatorsAliases:false, pool: { max: 5, //連線池最大連線數量 min: 0, //連線池最小連線數量 idle: 1000 //如果一個執行緒 10 秒內沒有使用則釋放該執行緒
} }); return sequelize } /*可以呼叫該方法測試是否能連線成功*/ connectionTest(){ this.sequelize() .authenticate() .then(()=>{ console.log('連線測試成功') }) .catch((err)=>{ console.log('連接出錯啦') }); } } module.exports = Db;

建立實體類user.js

./user.js
const Sequelize = require('sequelize');
const db = require('./db');			//我們首先引入之前寫好的db類
const dbs = new db;					//例項化
const sequelize = dbs.sequelize();	//呼叫該連線方法
dbs.connectionTest();					//呼叫該連線測試方法

class User {
     Users(){
        //首先我們來建立一張表模型 model
        let User = sequelize.define('user',{
            userName: {
                type: Sequelize.STRING,
                field: 'user_name'
            },
            email: {
                type: Sequelize.STRING
            }
        },{
            /*
             * 如果為true 則表名和model相同。即user
             * 如果為false Mysql建立的表名稱會是複數users
             * 如果指定的表名稱本來就是複數形式則不變*/
            freezeTableName: false
        });
        return User
    }

    /* 接下來我們我建立一張 user 表
     * 建立表方法
     * User.sync() 會建立表並且返回一個promise物件
     * 如果force = true 則會把存在表的先銷燬在建立表
     * 預設情況下 forse = false*/
     createTable(Users){
        Users.sync({force: false}).then(()=>{
            console.log(`建立表成功`)
        });
    }

    /*新增使用者*/
    async addUser(Users,userName,email){
       return Users.create({
            userName: userName,
            email:email
        })
    }

    /*第一個查詢*/
    async findAll(Users){
        let result = await Users.findAll();
        return result
    }
}


module.exports = User;

建立service 實現邏輯

./service.js
const User = require('./user');		//引入實體類User
let Users = new User();				//例項化

/*首先我們根據模型來建立一張表*/
let userModule = Users.Users();
Users.createTable(userModule);		//呼叫該方法 就會發現會自動幫我建立一張表
連線測試成功
Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` INTEGER NOT NULL auto_increment , `user_name` VARCHAR(255), `email` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `users`
建立表成功

之後我們將該方法註釋 在測試其他兩個方法

./service.js
const User = require('./user');		//引入實體類User
let Users = new User();				//例項化

/*首先我們根據模型來建立一張表*/
let userModule = Users.Users();
//Users.createTable(userModule);		//呼叫該方法 就會發現會自動幫我建立一張表

/*新增資料*/
async function addUser(name,email){
    try {
        let result = await Users.addUser(userModule,name,email);
      	 console.log('新增資料成功')
    }catch (err){
        console.log(err)
    }
}

addUser('test','[email protected]')

Executing (default): SELECT 1+1 AS result
連線測試成功
Executing (default): INSERT INTO `users` (`id`,`user_name`,`email`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'test','[email protected]','2018-12-18 06:12:12','2018-12-18 06:12:12');
新增資料成功

成功啦
同理我們來試一下查詢的方法

./service.js
const User = require('./user');		//引入實體類User
let Users = new User();				//例項化

/*首先我們根據模型來建立一張表*/
let userModule = Users.Users();
//Users.createTable(userModule);		//呼叫該方法 就會發現會自動幫我建立一張表

/*新增資料*/
async function addUser(name,email){
    try {
        let result = await Users.addUser(userModule,name,email);
      	 console.log('新增資料成功')
    }catch (err){
        console.log(err)
    }
}

//addUser('test','[email protected]')

/*第一個查詢*/
async function findAll(){
    try {
        let result = await Users.findAll(userModule);
        console.log(result[0].dataValues);
    }catch (err){
        console.log(err)
    }
}

findAll()
連線測試成功
Executing (default): SELECT `id`, `user_name` AS `userName`, `email`, `createdAt`, `updatedAt` FROM `users` AS `user`;
{ id: 1,
  userName: 'test',
  email: '[email protected]',
  createdAt: 2018-12-18T06:12:12.000Z,
  updatedAt: 2018-12-18T06:12:12.000Z }

成功啦 ~~~~