2017年8月10日20:12:20 Edit By K
簡(jiǎn)介
Sequelize 是一個(gè) Node.js 平臺(tái)基于Promise 的 ORM[1]声搁∈勇可以操作管理 Mysql一罩、Postgres莉测、SQLite 等關(guān)系型數(shù)據(jù)庫(kù)。
Sequelize 文檔 http://docs.sequelizejs.com/en/latest/
安裝
創(chuàng)建 NodeJs 項(xiàng)目
$ mkdir YourDirName
$ cd YourDirName
$ npm init
安裝 Sequelize 和 Mysql 包
$ npm install sequelize --save
$ npm install mysql --save
至此柔袁,安裝結(jié)束呆躲。
當(dāng)然我給你們發(fā)的包已經(jīng)創(chuàng)建好了 Node Express 項(xiàng)目及相關(guān)依賴,不必再安裝一遍捶索。
如果你想自己再試試的話歼秽,建議參考 Sequelize 官方文檔,如果沒(méi)記錯(cuò)的話情组,我當(dāng)時(shí)安裝的 Mysql 包是 mysql2。
$ npm install mysql2
兩者有沒(méi)有區(qū)別暫時(shí)還沒(méi)查箩祥,有興趣可以自行查一查院崇。
在我發(fā)給你們的項(xiàng)目中還有一些其他依賴包,類似于 BodyParser 等等袍祖,這些包可以在項(xiàng)目的 package.json
文件中找到底瓣。
來(lái)吧,操作數(shù)據(jù)庫(kù)蕉陋,造作吧
你需要一個(gè)數(shù)據(jù)庫(kù)
操作數(shù)據(jù)庫(kù)捐凭,沒(méi)有數(shù)據(jù)庫(kù)怎么行呢?首先我們要?jiǎng)?chuàng)建一個(gè) database凳鬓。
我發(fā)給大家的項(xiàng)目里數(shù)據(jù)庫(kù)名稱是 getitmore茁肠,請(qǐng)?jiān)?Mysql 中創(chuàng)建好。
在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候缩举,推薦選擇編碼 UTF-8垦梆,畢竟國(guó)際通用
我平時(shí)管理數(shù)據(jù)庫(kù)的軟件是 Navicat Premium,不再安利它了
連接真的如此簡(jiǎn)單
Sequelize 提供了多種多樣的連接方式仅孩,官網(wǎng)給出了如下幾種:
/*** 分別介紹一下連接方式 ***/
var sequelize = new Sequelize(database, [username=null], [password=null], [options={}]);
// 沒(méi)有密碼和 options 的情況
var sequelize = new Sequelize('database', 'username');
// 沒(méi)有options 的情況
var sequelize = new Sequelize('database', 'username', 'password');
// 沒(méi)有密碼托猩,有 options 的情況
var sequelize = new Sequelize('database', 'username', null, {});
// 啥都有的情況
var sequelize = new Sequelize('databse', 'username', 'password', {});
// 舉個(gè)沒(méi)有用戶名密碼和 options 的小栗子
var sequelize = new Sequelize('mysql://localhost:3306/databse', {});
/*** 下面這種方式適用于生產(chǎn)環(huán)境,推薦 ***/
var sequelize = new Sequelize('database', 'root', 'root', {
host: 'localhost', // 數(shù)據(jù)庫(kù)地址
dialect: 'mysql', // 數(shù)據(jù)庫(kù)類型
pool: {
max: 5, // 連接池最大連接數(shù)量
min: 0, // 連接池最小連接數(shù)量
idle: 10000 // 如果一個(gè)線程超過(guò)10秒鐘沒(méi)有被使用過(guò)就釋放該線程
}
})
我們項(xiàng)目采用的即時(shí)最后一種連接池的方式辽慕,連接時(shí) Sequelize 會(huì)設(shè)置一個(gè)連接池京腥,我們?cè)谑褂玫臅r(shí)候只需要實(shí)例化一個(gè)就行[2]
在項(xiàng)目中我創(chuàng)建了如下文件/controller/db.js
以供配置數(shù)據(jù)庫(kù)使用:
/**
* Created by K on 2017-07-31.
*/
var Sequelize = require("sequelize");
/**
* 連接指定類型的數(shù)據(jù)庫(kù)
* host:數(shù)據(jù)庫(kù)地址
* max:連接池最大連接數(shù)量
* min:連接池最小連接數(shù)量
* idle:每個(gè)線程最長(zhǎng)等待時(shí)間
* @type {Sequelize}
*/
module.exports = new Sequelize('getitmore', 'root', 'root', {
host: 'localhost',
dialect: 'mysql',
pool: {
max: 20,
min: 0,
idle: 10000
}
});
映射數(shù)據(jù)表
ORM 的思想是什么,映射成對(duì)象啊溅蛉,映射 Sql 語(yǔ)句啊公浪。好的他宛,我們來(lái)看看 Sequelize 怎么映射的吧。
/*** 舉個(gè)小栗子 user.js ***/
// 引入 sequelize 包因悲,創(chuàng)建 sequelize 實(shí)例
let Sequelize = require('sequelize');
let sequelize = require('./db.js');
// 創(chuàng)建 Model
let User = sequelize.define('user', {
// 指定映射的字段類型堕汞,字段名,例如數(shù)據(jù)庫(kù)中 user 表中的 username 字段映射成 username
username: {
type: Sequelize.STRING,
field: 'username'
},
// 如果不指定 field晃琳,會(huì)自動(dòng)映射相同名稱的字段
email: {
type: Sequelize.STRING
}
}, {
// freezeTabelName 為 true 時(shí)不會(huì)在庫(kù)中映射表時(shí)增加復(fù)數(shù)表名
// 該選項(xiàng)為 true 時(shí)讯检,user 在映射時(shí)映射成 user,而為 false 時(shí)會(huì)映射成users
freezeTableName: false
});
// 創(chuàng)建或同步表
// User.sync() 會(huì)返回一個(gè) Promise 對(duì)象
// force = true 時(shí)會(huì)把存在的表先 drop 掉再創(chuàng)建卫旱,好怕怕
let user = User.sync({ force: false});
// 現(xiàn)在可以操作 User 執(zhí)行增刪改查啦
// 舉兩個(gè)栗子
// 添加用戶
exports.addUser = function(username, email) {
return User.create({
username: username,
email: email
})
};
// 查找用戶
exports.findUserByName = function(username) {
return User.findOne({
where: {
username: username
}
})
};
以上是一個(gè)不那么完整的 Demo人灼,在我們項(xiàng)目中還有很多 options 需要設(shè)置,還有很多 Sequelize 的方法顾翼,遠(yuǎn)不止 create()
和findOne()
這么簡(jiǎn)單投放,字段類也遠(yuǎn)不止STRING
這一種。來(lái)看一個(gè)咱們項(xiàng)目中的 Model适贸,以原創(chuàng)表為栗子:
/**
* Created by kk on 2017/8/1.
*/
let Sequelize = require('sequelize');
let sequelize = require('../controller/db');
/**
* 定義原創(chuàng) Model
* 包括五個(gè)屬性 title灸芳、content、content_detail拜姿、img_url烙样、count、create_time
* freezeTableName 表示是否在數(shù)據(jù)庫(kù)中創(chuàng)建復(fù)數(shù)表名蕊肥,例如 users
* timestamp 表示是否在數(shù)據(jù)庫(kù)中創(chuàng)建 createAt 和 updateAt 字段
*/
let Original = sequelize.define('original', {
title: { type: Sequelize.STRING },
content: { type: Sequelize.STRING },
content_detail: { type: Sequelize.TEXT('long') },
img_url: { type: Sequelize.STRING },
count: { type: Sequelize.INTEGER },
create_time: { type: Sequelize.DATE }
}, {
freezeTableName: true,
timestamps: false
});
// 創(chuàng)建表谒获,force 為 true 時(shí)會(huì)先執(zhí)行 drop 再創(chuàng)建
let original = Original.sync({ force: false});
// 分頁(yè)獲取原創(chuàng)
exports.findOriginalPageList = function(pageNo, limit) {
console.log(pageNo);
return Original.findAll({
limit: limit,
offset: pageNo
});
};
// 根據(jù)id獲取原創(chuàng)詳細(xì)內(nèi)容
exports.findOriginalById = function(originalId) {
return Original.findById(originalId);
};
// 根據(jù)Id列表獲取原創(chuàng)
exports.findOriginalByIdList = function(originalIdList) {
return Original.findAll({
where: {
id: originalIdList
}
})
};
我為了讓項(xiàng)目顯得結(jié)構(gòu)清楚,創(chuàng)建了 Model 的文件夾壁却,所有映射的數(shù)據(jù)表都在該文件夾下批狱。當(dāng)然,我們項(xiàng)目中的栗子也不能囊括所有的 Sequelize 用法展东,最好的方式還是去看官網(wǎng)文檔赔硫。
啊盐肃?返回的是什么卦停,我怎么取值啊恼蓬?
來(lái)創(chuàng)建一個(gè)測(cè)試腳本看看它到底返回了一個(gè)什么惊完!
// test.js
var user = require('./user');
user.addUser('test', 'works@163.com').then(function() {
return user.findByName('test');
}).then(function(user) {
console.log('這里的 user 就是在執(zhí)行完 findByName 之后返回的對(duì)象');
console.log('username:' + user.username);
console.log('email:' + user.email);
})
至此,一個(gè)基本的數(shù)據(jù)庫(kù)操作就完成了处硬。執(zhí)行以下試試看:
$ node test.js
驚不驚喜小槐?意不意外?
注意
以上我介紹的 Sequelize 操作目錄結(jié)構(gòu)如下:
- YourDirName
- db.js
- user.js
- test.js
咱們項(xiàng)目的結(jié)構(gòu)我進(jìn)行了調(diào)整,將 controller凿跳、model件豌、和 view 進(jìn)行了人為劃分:
- NodeExpressServer
- controller
- db.js
- model
- extra.js
- collect.js
- user.js
- ...
- app.js
- controller
至此,還有什么問(wèn)題的話控嗜,問(wèn)我吧茧彤,向我開(kāi)炮吧。
說(shuō)句題外話疆栏,看看我寫的代碼是不是非常優(yōu)雅曾掂,哈哈哈,學(xué)著點(diǎn)
變量名壁顶,換行珠洗,空格的設(shè)置,整齊劃一的風(fēng)格若专,堅(jiān)持是一種信仰许蓖,習(xí)慣也不是一天養(yǎng)成的,推薦一本書(shū)《代碼整潔之道》
記椎魉ァ:你本來(lái)就很美膊爪。
安利這款新 Markdown 編輯器:Typora