NodeJS服務(wù)端sequelize操縱數(shù)據(jù)庫

使用基于ORM架構(gòu)的sequelize操縱數(shù)據(jù)庫

1、技術(shù)背景

Sequelize是一個基于promise的關(guān)系型數(shù)據(jù)庫ORM框架,*********************
技術(shù)文檔
https://blog.csdn.net/lisemi/article/details/102941626----完整api
https://itbilu.com/nodejs/npm/VkYIaRPz-.html#induction-install----基礎(chǔ)教程
https://itbilu.com/nodejs/npm/EJarwPD8W.html-----api
https://segmentfault.com/a/1190000017320533----操作多對多表關(guān)聯(lián)

2、安裝

$ npm install --save sequelize
# 還需要安裝以下之一:
$ npm install --save pg pg-hstore // postgreSql
$ npm install --save mysql // mysql 或 mariadb
$ npm install --save sqlite3 
$ npm install --save tedious // MSSQL

3、數(shù)據(jù)類型

Sequelize 中 Model 的數(shù)據(jù)類型對應(yīng)MySQL中的數(shù)據(jù)類型
Sequelize.STRING // VARCHAR(255) 類型:字符串 最大值: 65535個字符
Sequelize.STRING(1234) // VARCHAR(1234) 類型:變長 最大值: 65535個字符
Sequelize.TEXT // TEXT 類型:字符串 最大值:65535個字符
Sequelize.TEXT('tiny') // TINYTEXT 類型:字符串 最大值:255個字符
Sequelize.INTEGER // INTEGER 類型:整型 最大值:范圍(-2147483648~2147483647)
Sequelize.BIGINT // BIGINT 類型:整型 最大值:范圍(+-9.22*10的18次方)
Sequelize.BIGINT(11) // BIGINT(11) 類型:整型 最大值:范圍(+-9.22*10的18次方)
Sequelize.FLOAT // FLOAT 類型:單精度浮點型 8位精度(4字節(jié))
Sequelize.FLOAT(11) // FLOAT(11) 類型:單精度浮點型 8位精度(4字節(jié))
Sequelize.FLOAT(11, 12) // FLOAT(11,12) 類型:精度浮點型 8位精度(4字節(jié)) m總個數(shù),d小數(shù)位
Sequelize.DOUBLE // DOUBLE 類型:雙精度浮點型 16位精度(8字節(jié)) 
Sequelize.DOUBLE(11) // DOUBLE(11) 類型:雙精度浮點型 16位精度(8字節(jié)) 
Sequelize.DOUBLE(11, 12) // DOUBLE(11,12) 類型:雙精度浮點型 16位精度(8字節(jié)) m總個數(shù),d小數(shù)位
Sequelize.DECIMAL // DECIMAL 類型:定點數(shù)型
Sequelize.DECIMAL(10, 2) // DECIMAL(10,2) 類型:定點數(shù)型 參數(shù)m<65 是總個數(shù),d<30且 d<m 是小數(shù)位
Sequelize.DATE // DATETIME 類型:日期時間類型 范例:'2009-05-12 02:31:44'
Sequelize.DATE(6) // DATETIME(6) 
Sequelize.DATEONLY // DATE without time.
Sequelize.BOOLEAN // TINYINT(1) 類型:整型 范圍(-128~127)
Sequelize.ENUM('value 1', 'value 2') // ENUM 類型:枚舉
Sequelize.BLOB // BLOB 類型:二進制數(shù)據(jù)
Sequelize.BLOB('tiny') // TINYBLOB 類型:二進制數(shù)據(jù) 

3、建立連接

Sequelize會在初始化時設(shè)置一個連接池,這樣你應(yīng)該為每個數(shù)據(jù)庫創(chuàng)建一個實例:

先引入,然后指向Sequelize構(gòu)造函數(shù),然后new實例化連接數(shù)據(jù)庫
let Sequelize=require('sequelize')
var sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql'|'mariadb'|'sqlite'|'postgres'|'mssql',

pool: {
max: 5,
min: 0,
idle: 10000
},

// 僅 SQLite 適用
storage: 'path/to/database.sqlite'
});

// 或者可以簡單的使用一個連接 uri
var sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');

3、 model定義

model定義格式為sequelize.define('name', {attributes}, {options})

const Projects_cates = sequelize.define("projects_cates", {
project_id: Sequelize.STRING,
cate_id: Sequelize.STRING,
}, {
// freezeTabelName 為 true 時不會在庫中映射表時增加復(fù)數(shù)表名
// 該選項為 true 時,user 在映射時映射成 user,而為 false 時會映射成users
freezeTableName: true
})

User.sync({force: true}).then(function () {
// 已創(chuàng)建數(shù)據(jù)表
然后寫入表數(shù)據(jù)
return User.create({
firstName: 'John',
lastName: 'Hancock'
});
});
然后執(zhí)行同步數(shù)據(jù)表 User改為sequelize,是全部執(zhí)行同步
一次同步所有模型
可以使用sequelize.sync()方法來同步所有模型,而不是調(diào)用每個模型的sync()方法。

5、sequelize-nodejs方法

5.1、執(zhí)行多個方法

Promise.all([
db.Project_list.create({
name: '全功能APP UI KITS'
}),
db.Project_cate.create({
name: '全部11'
})
]).then(async (results)=>{
console.log('插入數(shù)據(jù)--------');
}).catch();
results------>是返回的對象,里面包含很多執(zhí)行函數(shù)

5.2、插入數(shù)據(jù)

create() - 插入單條數(shù)據(jù)
create(values, [options]) -> Promise.<Instance>

構(gòu)建一個新的模型實例,并進行保存。與build()方法不同的是,此方法除創(chuàng)建新實例外,還會將其保存到對應(yīng)數(shù)據(jù)庫表中。

參數(shù)

名稱 類型 說明
values Object
[options] Object
[options.raw=false] Boolean 設(shè)置為true時,值會忽略字段和虛擬設(shè)置器
[options.isNewRecord=true] Boolean
[options.fields] Array 如果設(shè)置后,只有列表中區(qū)別的列才會進行保存
[options.include] Array 用于構(gòu)建prefetched/included模型,參見 set
[options.onDuplicate] String
[options.transaction] Transaction 在事務(wù)中執(zhí)行查詢
[options.logging=false] Function 一個用于打印查詢時所執(zhí)行sql的函數(shù)
[options.searchPath=DEFAULT] String 指定schema的 search_path (僅 Postgres)
[options.benchmark=false] Boolean 當(dāng)打印SQL日志時同時輸出查詢執(zhí)行時間(毫秒)
bulkCreate() - 創(chuàng)建多條記錄
model.bulkCreate([
{
name: '全部',
btn_icon: 'fa fa-server fa-lg',
},{
name: 'PC端',
btn_icon: 'fa fa-television fa-lg',
}
])

批量創(chuàng)建并保存多個實例。

處理成功后,會在回調(diào)函數(shù)中返回一個包含多個實例的數(shù)組。

參數(shù)

名稱 類型 說明
records Array 要創(chuàng)建實例的對象(鍵/值 對)列表
[options] Object
[options.fields] Array 要插入的字段。默認全部
[options.validate=true] Boolean 插入每條記錄前進行驗證
[options.hooks=true] Boolean 在執(zhí)行前/后創(chuàng)建鉤子
[options.individualHooks=false] Boolean 在執(zhí)行前/后為每個實例創(chuàng)建鉤子
[options.ignoreDuplicates=false] Boolean 忽略重復(fù)主鍵(Postgres不支持)
[options.updateOnDuplicate] Array 如果行鍵已存在是否更新(mysql & mariadb支持). 默認為更新
[options.transaction] Transaction 在事務(wù)中執(zhí)行查詢
findCreateFind() - 查找或創(chuàng)建
findCreateFind(options) -> Promise.<Instance, created>

效率更高的findOrCreate,不會在事務(wù)中執(zhí)行。首先會嘗試進行查詢,如果為空則嘗試創(chuàng)建,如果是唯一約束則嘗試再次查找。

參數(shù)

名稱 類型 說明
options Object
options.where Object 查詢屬性
[options.defaults] Object 用于創(chuàng)建新實例的默認值
[options.transaction] Transaction 在事務(wù)中執(zhí)行查詢

5.3、查詢數(shù)據(jù)

findAll()` - 查詢多條數(shù)據(jù)

https://itbilu.com/nodejs/npm/V1PExztfb.html#api-findAll

findAll([options]) -> Promise.<Array.<Instance>>
查找范圍==》id=1,2的對象
findAll({
'order': [['id', 'DESC']], //排序降序
where: {id: [1,2]} //篩選
})
返回原始結(jié)果
findAll({
raw: true
})
連表查詢并統(tǒng)計count條數(shù)
post=await db.Post_list.findAndCountAll({
include: [{
model: db.Post_cate
}],
where: {'$post_cates.id$': req.body.cate_id},
raw: false
})

console.log(post,'全部文章');
findById() - 通過Id查詢單條數(shù)據(jù)
findById(id, [options]) -> Promise.<Instance>

通過Id(主鍵)查詢單個實例(單條數(shù)據(jù))。

參數(shù)

名稱 類型 說明
id Number | String | Buffer 要查詢實例的主鍵
[options] Object
[options.transaction] Transaction 在事務(wù)中執(zhí)行查詢
[options.searchPath=DEFAULT] String 指定schema的 search_path (僅 Postgres)
count() - 統(tǒng)計查詢結(jié)果數(shù)
count([options]) -> Promise.<Integer>

統(tǒng)計符合查詢條件的結(jié)果總數(shù)。

如果提供了include,將計算匹配關(guān)聯(lián)的數(shù)目

參數(shù)

名稱 類型 說明
[options] Object
[options.where] Object 查詢屬性(條件)
[options.include] Object Include 選項
[options.distinct] boolean 在主鍵上使用 COUNT(DISTINCT(col)), Model.aggregate 要使用其它列
[options.attributes] Object group中聯(lián)合使用
[options.group] Object 創(chuàng)建復(fù)雜統(tǒng)計時,會返回所需要的多行
[options.transaction] Transaction 在事務(wù)中執(zhí)行查詢Transaction to run query under
[options.logging=false] Function 一個用于打印查詢時所執(zhí)行sql的函數(shù)
[options.searchPath=DEFAULT] String 指定schema的 search_path (僅 Postgres)
[options.benchmark=false] Boolean 當(dāng)打印SQL日志時同時輸出查詢執(zhí)行時間(毫秒)
findAndCount() - 分頁查詢
findAndCount([findOptions]) -> Promise.<Object>

查詢由offset/limit指定的所有匹配行,并返回查詢條件所匹配的總數(shù)量。

Model.findAndCountAll({
where: ...,
limit: 12,
offset: 12
}).then(function (result) {
...
})

在上面查詢中,result是一個包含以兩個屬性的對象:

{
rows: [],
count: 
}

result.rows是匹配的查詢行,result.count是查詢條件匹配的總數(shù)量。

如果提供了include,將計算匹配關(guān)聯(lián)的數(shù)目

User.findAndCountAll({
include: [
{ model: Profile, required: true}
],
limit 3
});

5.4、update() - 更新記錄

// 修改每個`lastName`為`null`的記錄修改為"Doe"
User.update({ lastName: "Doe" }, {
where: {
lastName: null
}
}).then(() => {
console.log("Done");
});

參數(shù)

名稱 類型 說明
values Object
options Object
options.where Object 篩選條件
[options.fields] Array 要更新字段,默認為全部
[options.validate=true] Boolean 更新每條記錄前進行驗證
[options.hooks=true] Boolean 在執(zhí)行更新前/后創(chuàng)建鉤子
[options.individualHooks=false] Boolean 在執(zhí)行更新前/后為每個實例創(chuàng)建鉤子
[options.sideEffects=true] Boolean 是否更新任何虛擬設(shè)置
[options.returning=false] Boolean 返回受影響的行 (僅適用于 postgres)
[options.limit] Number 要更新的行數(shù) (僅適用于 mysql 和 mariadb)
[options.transaction] Transaction 在事務(wù)中執(zhí)行查詢
[options.silent=false] Boolean 如果為true,updatedAt字段將不會更新

5.5 destroy() - 刪除記錄

destroy(options) -> Promise.<Integer>
// 刪除每個名為 "Jane" 的記錄
User.destroy({
where: {
firstName: "Jane"
}
}).then(() => {
console.log("Done");
});

刪除多個實例,或設(shè)置deletedAt的時間戳為當(dāng)前時間(當(dāng)啟用paranoid時)

執(zhí)行成功后返回被刪除的行數(shù)

參數(shù)

名稱 類型 說明
options Object
[options.where] Object 篩選條件
[options.hooks=true] Boolean 在執(zhí)行前/后創(chuàng)建鉤子
[options.individualHooks=false] Boolean 在執(zhí)行前/后為每個實例創(chuàng)建鉤子
[options.limit] Number 要刪除的行數(shù)
[options.force=false] Boolean 刪除而不是設(shè)置 deletedAt 為當(dāng)前時間戳 (僅啟用 paranoid 時適用)
[options.truncate=false] Boolean 設(shè)置為true時,會使用TRUNCATE代替DELETE FROM,這時會忽略wherelimit選項
[options.cascade=false] Boolean 僅適用于連接查詢時的TRUNCATE操作,截斷所有外鍵匹配的表
[options.transaction] Transaction 在事務(wù)中執(zhí)行查詢

6 關(guān)聯(lián)關(guān)系

https://itbilu.com/nodejs/npm/sequelize-docs-v5.html#creating-persistent-instances

  1. BelongsTo
  2. HasOne
  3. HasMany
  4. BelongsToMany

相關(guān)文檔

中文文檔

我的個人網(wǎng)站(相關(guān)技術(shù)文首發(fā)地)www.pengwang.xyz

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容