




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第6章 SQL數(shù)據(jù)庫(kù)操作000011110111010101110100101110000111010010111111010000111101001010100111010010101010101001010100101010101001000000011001010010111001110Node.js開(kāi)發(fā)實(shí)戰(zhàn)教程新一代信息技術(shù)“十三五”系列 規(guī)劃教材Contents內(nèi)容導(dǎo)航6.2 優(yōu)雅地編寫(xiě)異步代碼6.1 操作MySQL數(shù)據(jù)庫(kù)6.3 使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù) MySQL服務(wù)器安裝和基本使用 連接MySQL數(shù)據(jù)庫(kù) 執(zhí)行數(shù)據(jù)庫(kù)操作 記錄增查改刪操作 高級(jí)操作 6.4 實(shí)戰(zhàn)
2、演練圖書(shū)借閱記錄管理操作MySQL數(shù)據(jù)庫(kù)(1)了解MySQL數(shù)據(jù)庫(kù);(2)使用Node.js連接和訪問(wèn)MySQL數(shù)據(jù)庫(kù)?!緦W(xué)習(xí)目標(biāo)】如果已有MySQL數(shù)據(jù)庫(kù)服務(wù)器,則可以直接使用MySQL,否則需要安裝MySQL。MySQL社區(qū)版遵循GPL許可協(xié)議,可以從其官網(wǎng)上免費(fèi)下載。 【MySQL服務(wù)器安裝和基本使用】00Section01Section安裝MySQL服務(wù)器操作MySQL數(shù)據(jù)庫(kù)設(shè)置MySQL服務(wù)器配置類(lèi)型和網(wǎng)絡(luò) 【MySQL服務(wù)器安裝和基本使用】01Section以在Windows 7系統(tǒng)中安裝MySQL 5.7.26社區(qū)版為例。安裝該版本之前需要確認(rèn)系統(tǒng)已安裝有Visual C+ 20
3、13運(yùn)行庫(kù)和Microsoft .NET Framework 4.5.2(或更高版本)。運(yùn)行程序安裝向?qū)?,根?jù)提示完成MySQL服務(wù)器的安裝和初始配置。安裝MySQL服務(wù)器操作MySQL數(shù)據(jù)庫(kù)【MySQL服務(wù)器安裝和基本使用】進(jìn)入MySQL控制臺(tái)mysql -h hostname -u username -p常用命令mysql-CREATE DATABASE dbname;/創(chuàng)建數(shù)據(jù)庫(kù)mysql-CREATE TABLE tablename;/創(chuàng)建表mysql-SHOW DATABASES;/顯示可用的數(shù)據(jù)庫(kù)列表mysql-USE dbname;/選擇數(shù)據(jù)庫(kù)mysql-SHOW TABLES;
4、/顯示可用的表mysql-DESCRIBE tablename;/顯示表的信息導(dǎo)出整個(gè)數(shù)據(jù)庫(kù)的命令:mysqldump -u 用戶名 -p 數(shù)據(jù)庫(kù)名 導(dǎo)出的文件名 導(dǎo)出某個(gè)表的命令:mysqldump -u 用戶名 -p 數(shù)據(jù)庫(kù)名 表名 導(dǎo)出的文件名創(chuàng)建數(shù)據(jù)庫(kù),進(jìn)入MySQL控制臺(tái)后可使用source命令導(dǎo)入數(shù)據(jù)庫(kù)。直接導(dǎo)入數(shù)據(jù)庫(kù):mysql -u用戶名 -p密碼 數(shù)據(jù)庫(kù)名 ?, Rick C-137, 53, function(err, results, fields) console.log(results); );08Section操作MySQL數(shù)據(jù)庫(kù)【使用連接池】const mysql
5、 = require(mysql2);/創(chuàng)建連接池const pool = mysql.createPool( host: localhost, user: root, password: abc123, database: testmydb, waitForConnections: true, connectionLimit: 10, queueLimit: 0);/使用連接池pool.query(SELECT * FROM bookinfo , function (err, results, fields) console.log(查詢結(jié)果:,results); );09SectionCo
6、ntents內(nèi)容導(dǎo)航6.2 優(yōu)雅地編寫(xiě)異步代碼6.3 使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù) Promise Generator co模塊 async/await 使用Promise包裝器操作MySQL數(shù)據(jù)庫(kù)6.4 實(shí)戰(zhàn)演練圖書(shū)借閱記錄管理6.1 操作MySQL數(shù)據(jù)庫(kù)優(yōu)雅地編寫(xiě)異步代碼(1)了解Node.js異步編程方法;(2)能夠編寫(xiě)數(shù)據(jù)庫(kù)操作的異步代碼?!緦W(xué)習(xí)目標(biāo)】解決回調(diào)地獄問(wèn)題。解決異步流程控制問(wèn)題。簡(jiǎn)化在異步代碼中捕獲異常。00Section以同步方式編寫(xiě)異步代碼的解決方案實(shí)質(zhì)上只是改變了代碼編寫(xiě)方式,簡(jiǎn)化和優(yōu)化代碼的寫(xiě)法,使開(kāi)發(fā)人員以更優(yōu)雅的方式編寫(xiě)異步代碼,以解決異步代碼的
7、流程控制問(wèn)題,降低了異步編程難度。但程序本質(zhì)上還是異步執(zhí)行的,這些方案并沒(méi)有對(duì)程序本身進(jìn)行優(yōu)化,也沒(méi)有提高應(yīng)用程序性能。優(yōu)雅地編寫(xiě)異步代碼Promise工作機(jī)制 【Promise】01SectionPromise對(duì)象代表一個(gè)異步操作,有以下3種狀態(tài)。等待(Pending):初始狀態(tài),沒(méi)有實(shí)現(xiàn)也沒(méi)有被拒絕。實(shí)現(xiàn)(Fulfilled):操作已成功完成。被拒絕(Rejected):操作失敗。只有異步操作的結(jié)果才可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無(wú)法改變這個(gè)狀態(tài)。簡(jiǎn)化回調(diào)嵌套只是Promise的一項(xiàng)基本功能,Promise最關(guān)鍵的是狀態(tài),Promise通過(guò)維護(hù)和傳遞狀態(tài)的方式使回調(diào)函數(shù)能夠及時(shí)被
8、調(diào)用,這比直接傳遞回調(diào)函數(shù)要簡(jiǎn)單和靈活得多。什么是Promise優(yōu)雅地編寫(xiě)異步代碼【Promise】let promise = new Promise(resolve, reject) = /執(zhí)行異步操作代碼 if (/*成功 */) resolve(value); /異步操作執(zhí)行成功后的回調(diào)函數(shù) else reject(error); /異步操作執(zhí)行失敗后的回調(diào)函數(shù));01Section創(chuàng)建Promise對(duì)象優(yōu)雅地編寫(xiě)異步代碼【Promise】then()promise.then(value) = /成功 console.log(成功,value); ,(error) = /失敗 conso
9、le.err(失敗,error); )01SectionPromise的方法catch()promise.then(value) = console.log(成功,value);).catch(error) = console.err(失敗,error);)優(yōu)雅地編寫(xiě)異步代碼【Promise】Promise.resolve()Promise.reject()Promise.all()var promise1 = Promise.resolve(70);var promise2 = 82;var promise3 = new Promise(function(resolve) setTimeou
10、t(resolve,1000,95); /1秒鐘之后執(zhí)行);Promise.all(promise1, promise2, promise3).then(function(values) console.log(values););/ 輸出數(shù)組: 70, 82, 95 01SectionPromise的方法Promise.race()Promise的鏈?zhǔn)讲僮鲀?yōu)雅地編寫(xiě)異步代碼【Generator】Generator是一個(gè)生成器,同時(shí)也是一個(gè)狀態(tài)機(jī),其內(nèi)部擁有值和相關(guān)狀態(tài)。生成器返回一個(gè)迭代器(Iterator)對(duì)象,可以編寫(xiě)程序通過(guò)該對(duì)象遍歷相關(guān)的值和狀態(tài),以保證正確的執(zhí)行順序。Generat
11、or本質(zhì)上是一個(gè)函數(shù),其最大的特點(diǎn)是可以被中斷,然后再恢復(fù)執(zhí)行。Promise對(duì)象創(chuàng)建之后,就會(huì)處于等待狀態(tài)并開(kāi)始執(zhí)行,直到狀態(tài)改變之后才能進(jìn)行下一步操作。Generator函數(shù)可以由用戶執(zhí)行中斷,去執(zhí)行其他操作,然后從中斷處恢復(fù)執(zhí)行。02Section什么是Generator優(yōu)雅地編寫(xiě)異步代碼【Generator】function* genFunc(score) /聲明Generator函數(shù)聲明 yield 積分+score; yield 積分+(score + 10); return 積分+(score + 20); yield 積分+(score + 30);var gen = genF
12、unc(10); / 調(diào)用之后返回了一個(gè)迭代器對(duì)象console.log(gen.next(); / 返回對(duì)象 value: 積分10, done: false console.log(gen.next(); / 返回對(duì)象 value: 積分20, done: false console.log(gen.next(); / 返回對(duì)象 value: 積分30, done: false console.log(gen.next(); / 返回對(duì)象 value: undefined, done: true 02SectionGenerator函數(shù)聲明及其執(zhí)行優(yōu)雅地編寫(xiě)異步代碼【Generator】調(diào)
13、用Generator對(duì)象有兩種方法。不斷地調(diào)用next()方法。next()方法會(huì)執(zhí)行Generator的代碼,每次遇到y(tǒng)ield就返回一個(gè)對(duì)象(形式為value: x, done: true/false),然后“暫?!?,返回的value就是yield的返回值,done表示該Generator對(duì)象是否已經(jīng)執(zhí)行結(jié)束了。直接用循環(huán)語(yǔ)句for . of自動(dòng)遍歷Generator對(duì)象。for (let obj of gen) console.log(obj); break; / 關(guān)閉迭代器,觸發(fā)return /最終返回:積分1002Section調(diào)用Generator對(duì)象使用Generator解決異步
14、回調(diào)問(wèn)題可以將異步操作寫(xiě)在yield語(yǔ)句中,在調(diào)用next()方法后再向后執(zhí)行。yield除了使用表達(dá)式之外,還可以使用Promise對(duì)象。由yield對(duì)表達(dá)式求值并返回,調(diào)用next()方法會(huì)返回一個(gè)Promise對(duì)象,接著調(diào)用then()方法,并在回調(diào)函數(shù)中通過(guò)next()方法將結(jié)果傳回Generator。Generator與Promise對(duì)象聯(lián)合使用,大大改進(jìn)異步代碼編寫(xiě)流程。優(yōu)雅地編寫(xiě)異步代碼【co模塊】co模塊將Generator函數(shù)包裝成一個(gè)Promise對(duì)象,作為參數(shù)傳遞給co()方法,在co()方法內(nèi)部自動(dòng)執(zhí)行yield,以將異步操作改為“順序”執(zhí)行。co()方法包括一個(gè)Gen
15、erator函數(shù),co()方法在Generator函數(shù)中使用yield指向Promise對(duì)象,通過(guò)遞歸調(diào)用next()方法將每一個(gè)Promise的值返回,從而實(shí)現(xiàn)異步轉(zhuǎn)“同步”的代碼編寫(xiě)方式。co()方法返回一個(gè)Promise對(duì)象,可以調(diào)用then()和catch()方法對(duì)Generator函數(shù)返回的結(jié)果進(jìn)行傳遞,以方便后續(xù)的成功處理或者錯(cuò)誤處理。 03Sectionco模塊實(shí)現(xiàn)思路優(yōu)雅地編寫(xiě)異步代碼【co模塊】要使用co模塊,需要安裝相應(yīng)的包:npm install co然后在程序中導(dǎo)入該模塊:const co = require(co);示例: co返回一個(gè)Promise對(duì)象co(func
16、tion* () /聲明一個(gè)co-generator函數(shù) var result = yield Promise.resolve(true); return result;).then(function (value) console.log(value);, function (err) console.error(err.stack););03Sectionco模塊的基本使用優(yōu)雅地編寫(xiě)異步代碼【co模塊】co模塊目前支持的對(duì)象類(lèi)型PromiseThunks(函數(shù))數(shù)組(并行執(zhí)行)對(duì)象(并行執(zhí)行)Generator(代理)Generator函數(shù)(代理)對(duì)象嵌套03Section可用的yield
17、對(duì)象數(shù)組用于并行完成所有的yield異步操作:co(function* () var res = yield Promise.resolve(路人甲), Promise.resolve(路人乙), ; console.log(res); / = 路人甲, 路人乙);對(duì)象用于并行處理:co(function* () var res = yield 男配: Promise.resolve(路人甲), 女配: Promise.resolve(路人乙), ; console.log(res); / 返回 : 男配: 路人甲, 女配: 路人乙 );優(yōu)雅地編寫(xiě)異步代碼【co模塊】const co = re
18、quire(co);co(function *() try yield Promise.reject(new Error(發(fā)生錯(cuò)誤!); catch (err) console.error(err.message); / 發(fā)生錯(cuò)誤! ).catch(onerror);function onerror(err) / 記錄未捕獲的錯(cuò)誤,co模塊不會(huì)拋出未處理的任何錯(cuò)誤,需要自己處理所有錯(cuò)誤 console.error(err.stack);03Sectionco模塊的錯(cuò)誤捕獲優(yōu)雅地編寫(xiě)異步代碼【async/await】async/await從上到下順序執(zhí)行,符合編寫(xiě)代碼的習(xí)慣。async/awai
19、t可以傳遞的參數(shù)數(shù)量不受限制。同步代碼和異步代碼可以一起編寫(xiě),只是要注意異步過(guò)程需要包裝成一個(gè)Promise對(duì)象并置于await關(guān)鍵字后面。async/await基于協(xié)程(Coroutine)的機(jī)制,是對(duì)異步過(guò)程更精確的一種描述。async/await是對(duì)Promise的改進(jìn)。只是語(yǔ)法糖,本質(zhì)上仍然是Promise。04Sectionasync/await的特點(diǎn)優(yōu)雅地編寫(xiě)異步代碼【async/await】function resolveAfter1Seconds() /將異步過(guò)程包裝為Promise return new Promise(resolve = setTimeout() = res
20、olve(已成功); , 1000); );async function asyncFunc() /定義async函數(shù) console.log(正在執(zhí)行async函數(shù)); var result = await resolveAfter1Seconds(); / await表達(dá)式 console.log(result); / 輸出已成功asyncFunc(); /調(diào)用async函數(shù)console.log(async函數(shù)代碼開(kāi)始執(zhí)行); 04Sectionasync/await的基本用法優(yōu)雅地編寫(xiě)異步代碼【async/await】定義async函數(shù)的語(yǔ)法格式如下:async function na
21、me(param, param, . param) statements async函數(shù)返回的是Promise對(duì)象。上例中調(diào)用async函數(shù)的代碼可擴(kuò)展為:asyncFunc().then(data = console.log(data); / 獲取async函數(shù)返回的內(nèi)容).catch(error = console.log(error); / 捕獲async函數(shù)的錯(cuò)誤);04Sectionasync函數(shù)優(yōu)雅地編寫(xiě)異步代碼【async/await】await操作符用于等待一個(gè)Promise對(duì)象,語(yǔ)法格式如下:rv = await expression;04Sectionawait操作符在as
22、ync函數(shù)外部,對(duì)async函數(shù)返回的Promise對(duì)象采用catch()方法進(jìn)行錯(cuò)誤處理。在async函數(shù)內(nèi)部使用await表達(dá)式,采用try/catchy語(yǔ)句塊同步進(jìn)行錯(cuò)誤處理。例如:async function getProcessedData(url) let v; try v = await downloadData(url); catch(e) v = await downloadFallbackData(url); return processDataInWorker(v);await后面的Promise對(duì)象自行處理錯(cuò)誤,也就是將異步過(guò)程包裝為Promise對(duì)象,在該對(duì)象的函數(shù)定
23、義中處理錯(cuò)誤。async/await的錯(cuò)誤處理優(yōu)雅地編寫(xiě)異步代碼【async/await】串行是指按順序執(zhí)行每一個(gè)任務(wù)。并發(fā)是指輪換執(zhí)行多個(gè)任務(wù),看起來(lái)好像多個(gè)任務(wù)同時(shí)執(zhí)行。并行是指真正地同時(shí)執(zhí)行多個(gè)任務(wù)。如果一個(gè)async函數(shù)中有多個(gè)await語(yǔ)句,程序會(huì)變成完全的串行操作。當(dāng)異步操作之間不存在結(jié)果的依賴關(guān)系時(shí),可以使用Promise.all()方法實(shí)現(xiàn)并行,Promise.all()中的所有方法是同時(shí)執(zhí)行的。先執(zhí)行async函數(shù)將多個(gè)Promise合起來(lái)發(fā)起請(qǐng)求,然后再進(jìn)行await操作。并發(fā)也是將多個(gè)Promise合起來(lái)發(fā)起請(qǐng)求。04Sectionasync/await的串行、并發(fā)和并行
24、操作優(yōu)雅地編寫(xiě)異步代碼【使用Promise包裝器操作MySQL數(shù)據(jù)庫(kù)】const pool = require(mysql2/promise).createPool( user: root, password: abc123, database: testmydb,);pool.getConnection() .then(conn = const res = conn.query(SELECT * FROM bookinfo); conn.release(); return res; ).then(result = console.log(result); ).catch(err = cons
25、ole.log(err); /以上任何連接時(shí)或查詢時(shí)錯(cuò)誤 );05Section使用基本的Promise優(yōu)雅地編寫(xiě)異步代碼【使用Promise包裝器操作MySQL數(shù)據(jù)庫(kù)】async function getData() /聲明一個(gè)async函數(shù) const mysql = require(mysql2/promise); const pool = mysql.createPool( user: root,password: abc123, database: testmydb); / 并行執(zhí)行 var results = await Promise.all(pool.query(SELECT
26、* FROM bookinfo WHERE press = 人民郵電出版社), pool.query(SELECT * FROM bookinfo WHERE press = 清華大學(xué)出版社); await pool.end(); /并行執(zhí)行結(jié)束后關(guān)閉連接池 return results; /返回結(jié)果(Promise對(duì)象) ; getData().then(data = / 調(diào)用async函數(shù)并獲取async函數(shù)返回的內(nèi)容 console.log(data0); /第1個(gè)查詢的結(jié)果 console.log(data0); /第2個(gè)查詢的結(jié)果).catch(error = console.log
27、(error); / 捕獲async函數(shù)的錯(cuò)誤);05Section使用ES2017 async/await優(yōu)雅地編寫(xiě)異步代碼【使用Promise包裝器操作MySQL數(shù)據(jù)庫(kù)】const mysql = require(mysql2);const co = require(co);co(function * () /聲明一個(gè)co-generator函數(shù) const c = yield mysql.createConnectionPromise(user: root, password: abc123,database: testmydb ); /獲取連接 const rows = yield c
28、.query(SELECT * FROM bookinfo WHERE press = 人民郵電出版社); /執(zhí)行查詢語(yǔ)句 console.log(rows); console.log(yield c.execute(SELECT * FROM bookinfo WHERE press = 清華大學(xué)出版社); /執(zhí)行預(yù)處理語(yǔ)句 yield c.end(); /終止連接);05Section使用co模塊Contents內(nèi)容導(dǎo)航6.3 使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)6.2 優(yōu)雅地編寫(xiě)異步代碼 Sequelize簡(jiǎn)介 Sequelize的基本使用 使用Sequelize的關(guān)聯(lián)6.4 實(shí)
29、戰(zhàn)演練圖書(shū)借閱記錄管理6.1 操作MySQL數(shù)據(jù)庫(kù)使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)(1)了解Node.js的ORM框架;(2)掌握Sequelize框架的用法?!緦W(xué)習(xí)目標(biāo)】ORM兩大優(yōu)勢(shì)可以像操作對(duì)象一樣操作數(shù)據(jù)庫(kù)。提高開(kāi)發(fā)效率。ORM對(duì)數(shù)據(jù)庫(kù)進(jìn)行高層封裝,不足之處主要是會(huì)犧牲程序的執(zhí)行效率。Sequelize是一款基于Promise的支持異步操作的Node.js ORM框架,支持Postgres、MySQL、SQLite和Microsoft SQL Server等多種數(shù)據(jù)庫(kù),具有強(qiáng)大的事務(wù)支持、關(guān)聯(lián)關(guān)系、讀取和復(fù)制等功能,很適合作為Node.js后端數(shù)據(jù)庫(kù)的存儲(chǔ)接口,有助于提高N
30、ode.js應(yīng)用程序的開(kāi)發(fā)效率。00Section【Sequelize簡(jiǎn)介】01Section使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【Sequelize的基本使用】安裝sequelize庫(kù)cnpm install -save sequelize為數(shù)據(jù)庫(kù)安裝相應(yīng)的Node.js數(shù)據(jù)庫(kù)驅(qū)動(dòng):npm install -save pg pg-hstore # Postgres數(shù)據(jù)庫(kù)npm install -save mysql2 #MySQL數(shù)據(jù)庫(kù)npm install -save mariadb #MariaDB數(shù)據(jù)庫(kù)npm install -save sqlite3 # SQLitenpm
31、install -save tedious # Microsoft SQL Server02Section安裝sequelize庫(kù)及數(shù)據(jù)庫(kù)驅(qū)動(dòng)使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【Sequelize的基本使用】基本用法const Sequelize = require(sequelize);/ 第1種方式:?jiǎn)为?dú)傳遞參數(shù)const sequelize = new Sequelize(database, username, password, host: localhost, dialect: /*可以是mysql、mariadb、postgres或mssql中任何一個(gè) */);/ 第2種
32、方式:傳遞連接URLconst sequelize = new Sequelize(postgres:/user:pass:5432/dbname);02Section建立連接使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【Sequelize的基本使用】示例const Sequelize = require(sequelize);const sequelize = new Sequelize(testmydb, root, abc123, /連接選項(xiàng) host: localhost, / 數(shù)據(jù)庫(kù)地址 dialect: mysql, / 指定連接的數(shù)據(jù)庫(kù)類(lèi)型 pool: max: 5, / 連接池
33、的最大連接數(shù)量 min: 0, / 連接池的最小連接數(shù)量 idle: 10000 / 如果一個(gè)線程10秒鐘內(nèi)沒(méi)有被使用,那么就釋放線程 );/測(cè)試連接sequelize .authenticate() .then() = console.log(成功建立連接); ) .catch(err = console.error(未能連接到數(shù)據(jù)庫(kù):, err); );02Section建立連接使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【Sequelize的基本使用】使用Sequelize.Model.init(attributes, options)函數(shù)const Model = Sequelize.
34、Model;class User extends Model User.init( / 屬性設(shè)置 name: type: Sequelize.STRING, allowNull: false , email: type: Sequelize.STRING / allowNull(允許空值)默認(rèn)為true , sequelize, modelName: user /此處定義模型名 / 選項(xiàng));02Section定義模型使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【Sequelize的基本使用】使用sequelize.define(name, attributes, options)const U
35、ser = sequelize.define(user, / user為模型名 / 屬性 name: type: Sequelize.STRING, allowNull: false , email: type: Sequelize.STRING , / 選項(xiàng));02Section定義模型使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【Sequelize的基本使用】/ 選項(xiàng)force: true 表示如果表已經(jīng)存在,在新建前會(huì)刪除厚表User.sync( force: true ).then() = / 數(shù)據(jù)庫(kù)中的表與模型定義一致 return User.create( name: 小莉, em
36、ail: xiaoli ););02Section將模型與數(shù)據(jù)庫(kù)同步使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【Sequelize的基本使用】/ 創(chuàng)建新的用戶User.create( name: 小彤, email: xiaotong ).then() = console.log(已添加););/ 查找所有用戶User.findAll().then(users = console.log(所有用戶:, JSON.stringify(users, null, 4););/ 將沒(méi)有郵箱的用戶的郵箱改為itUser.update( eamil: it , where: email: null ).
37、then() = console.log(已改完););/ 刪除名為小紅的用戶User.destroy( where: name: 小紅 ).then() = console.log(已刪除););02Section數(shù)據(jù)的增查改刪使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【Sequelize的基本使用】Sequelize使用Promise來(lái)控制異步操作流程,增查改刪操作都可使用then()方法。如果Node.js版本支持,可以使用ES2017 async/await語(yǔ)法來(lái)編寫(xiě)Sequelize所用的異步調(diào)用代碼。Sequelize的所有Promise對(duì)象也是Bluebird的Promise對(duì)
38、象,也可以使用Bluebird API來(lái)操作。Sequelize返回的Promise對(duì)象也可以通過(guò)co模塊來(lái)操作。02SectionPromises和async/await使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【使用Sequelize的關(guān)聯(lián)】源和目標(biāo)class User extends Model User.init( name: Sequelize.STRING, email: Sequelize.STRING, sequelize, modelName: user);class Project extends Model Project.init( name: Sequelize.S
39、TRING, sequelize, modelName: project);User.hasOne(Project);03Section基本概念使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【使用Sequelize的關(guān)聯(lián)】外鍵Sequelize創(chuàng)建模型之間的關(guān)聯(lián)時(shí),將自動(dòng)創(chuàng)建帶有約束的外鍵引用。創(chuàng)建Task和User模型之間的關(guān)系會(huì)在tasks表中插入外鍵userId,并將該外鍵作為對(duì)users表的引用class Task extends Model Task.init( title: Sequelize.STRING , sequelize, modelName: task );class U
40、ser extends Model User.init( username: Sequelize.STRING , sequelize, modelName: user );User.hasMany(Task); / 自動(dòng)將userId添加到Task模型Task.belongsTo(User); /也會(huì)自動(dòng)將userId添加到Task模型03Section基本概念使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【使用Sequelize的關(guān)聯(lián)】belongsTo關(guān)聯(lián)belongsTo關(guān)聯(lián)在源模型上存在一對(duì)一關(guān)系的外鍵。示例:Player通過(guò)players表的外鍵作為T(mén)eam的一部分class Pla
41、yer extends Model Player.init(/* 屬性定義 */, sequelize, modelName: player );class Team extends Model Team.init(/* 屬性定義 */, sequelize, modelName: team );Player.belongsTo(Team); / 向Team模型添加teamId屬性以保存Team的主鍵值03Section一對(duì)一關(guān)聯(lián)使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【使用Sequelize的關(guān)聯(lián)】hasOne關(guān)聯(lián)hasOne關(guān)聯(lián)是在目標(biāo)模型上存在的一對(duì)一關(guān)系的外鍵的關(guān)聯(lián)。示例:向Use
42、r模型添加projectId屬性const User = sequelize.define(user, /* . */)const Project = sequelize.define(project, /* . */)Project.hasOne(User) / 單向關(guān)聯(lián)03Section一對(duì)一關(guān)聯(lián)使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【使用Sequelize的關(guān)聯(lián)】hasOne和belongsTo之間的區(qū)別hasOne在目標(biāo)模型中插入關(guān)聯(lián)鍵,而belongsTo在源模型中插入關(guān)聯(lián)鍵。示例const Player = this.sequelize.define(player, /* 屬
43、性定義 */)const Coach = this.sequelize.define(coach, /* 屬性定義 */)const Team = this.sequelize.define(team, /* 屬性定義 */);當(dāng)有關(guān)關(guān)聯(lián)的信息存在于源模型中時(shí),可以使用belongsTo關(guān)聯(lián)。例中Player適用于belongsTo關(guān)聯(lián),因?yàn)樗哂衪eamId列。Player.belongsTo(Team) / teamId 將被添加到源模型Player中當(dāng)有關(guān)關(guān)聯(lián)的信息存在于目標(biāo)模型中時(shí),可以使用hasOne關(guān)聯(lián)。例中Coach適用于hasOne關(guān)聯(lián),因?yàn)門(mén)eam模型將其Coach的信息存儲(chǔ)
44、為coachId列。Coach.hasOne(Team) / coachId將被添加到目標(biāo)模型Team中03Section一對(duì)一關(guān)聯(lián)使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【使用Sequelize的關(guān)聯(lián)】一對(duì)多關(guān)聯(lián)將一個(gè)源與多個(gè)目標(biāo)連接起來(lái),多個(gè)目標(biāo)連接到同一個(gè)特定的源:const User = sequelize.define(user, /* . */)const Project = sequelize.define(project, /* . */)Project.hasMany(User, as: Workers)hasMany()用于定義一對(duì)多關(guān)聯(lián)。要在不同的列上關(guān)聯(lián)記錄,可以使
45、用sourceKey選項(xiàng)指定源鍵:const City = sequelize.define(city, countryCode: Sequelize.STRING );const Country = sequelize.define(country, isoCode: Sequelize.STRING );/ 可以根據(jù)國(guó)家代碼連接國(guó)家和城市Country.hasMany(City, foreignKey: countryCode, sourceKey: isoCode);City.belongsTo(Country, foreignKey: countryCode, targetKey: i
46、soCode);03Section一對(duì)多關(guān)聯(lián)使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)【使用Sequelize的關(guān)聯(lián)】多對(duì)多關(guān)聯(lián)用于將源與多個(gè)目標(biāo)相連接,目標(biāo)也可以連接到多個(gè)源:Project.belongsToMany(User, through: UserProject);User.belongsToMany(Project, through: UserProject);03Section多對(duì)多關(guān)聯(lián)Contents內(nèi)容導(dǎo)航6.4 實(shí)戰(zhàn)演練圖書(shū)借閱記錄管理6.2 優(yōu)雅地編寫(xiě)異步代碼 編寫(xiě)模型部分代碼 編寫(xiě)數(shù)據(jù)操作部分代碼6.3 使用Node.js ORM框架操作關(guān)系數(shù)據(jù)庫(kù)6.1 操作MyS
47、QL數(shù)據(jù)庫(kù)實(shí)戰(zhàn)演練圖書(shū)借閱記錄管理(1)綜合運(yùn)用SQL數(shù)據(jù)庫(kù)知識(shí);(2)掌握利用Sequelize操作MySQL數(shù)據(jù)庫(kù)的編程。【學(xué)習(xí)目標(biāo)】00Section此案例用于記錄圖書(shū)的借閱信息,為簡(jiǎn)化實(shí)驗(yàn)過(guò)程,只有兩個(gè)表books(圖書(shū))和readers(讀者),它們之間是一對(duì)多的關(guān)系,一種圖書(shū)可以對(duì)應(yīng)多個(gè)讀者,使用自動(dòng)建立表結(jié)構(gòu)的方案。在實(shí)際的應(yīng)用程序開(kāi)發(fā)中,往往將數(shù)據(jù)部分獨(dú)立出來(lái),作為模型部分,這樣有利于各模塊的解耦和擴(kuò)展。實(shí)戰(zhàn)演練圖書(shū)借閱記錄管理定義圖書(shū)數(shù)據(jù)模型const Sequelize = require(sequelize); module.exports = (sequelize) =
48、 var Book = sequelize.define(book, isbn: type: Sequelize.STRING , name: type: Sequelize.STRING , author: type: Sequelize.STRING , press: type: Sequelize.STRING , price: type: Sequelize.DECIMAL(10, 2) , pubdate: type: Sequelize.DATEONLY ); return Book;【編寫(xiě)模型部分代碼】01Section實(shí)戰(zhàn)演練圖書(shū)借閱記錄管理定義讀者數(shù)據(jù)模型const Sequ
49、elize = require(sequelize); module.exports = (sequelize) = var Reader = sequelize.define(reader, name: type: Sequelize.STRING , mobile: type: Sequelize.STRING , email: type: Sequelize.STRING ); return Reader;【編寫(xiě)模型部分代碼】01Section實(shí)戰(zhàn)演練圖書(shū)借閱記錄管理同步數(shù)據(jù)模型const Sequelize = require(sequelize);const sequelize =
50、new Sequelize(testmydb, root, abc123, /連接選項(xiàng) host: localhost, / 數(shù)據(jù)庫(kù)地址 dialect: mysql, / 指定連接的數(shù)據(jù)庫(kù)類(lèi)型 define: charset:utf8 /解決中文輸入問(wèn)題 , pool: / 建立連接池 max: 5, / 連接池的最大連接數(shù)量 min: 0, / 連接池的最小連接數(shù)量 idle: 20000 / 如果一個(gè)線程在20秒內(nèi)沒(méi)有被使用過(guò),那么釋放線程 );const Book = require(./book_model)(sequelize);/導(dǎo)入Book模型const Reader = require(./reader_model)(sequelize);/導(dǎo)入Reader模型Book.hasMany(Reader); /一種圖書(shū)有多個(gè)讀者Reader.belongsTo(Book); /一個(gè)讀者對(duì)應(yīng)一種圖書(shū)sequelize.sync(); /自動(dòng)同步所有的模型,使用關(guān)聯(lián)時(shí)要使用。首次添加數(shù)據(jù)之后可將其注釋掉exports.Book = Book;export
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)業(yè)合伙人分紅合同范本
- 農(nóng)村燃?xì)獍惭b合同范本
- 企業(yè)常用合同范本庫(kù)
- 別墅精裝修包工合同范本
- 勞動(dòng)合同范本(社保)
- 勞動(dòng)保密合同范例
- 北辰區(qū)勞務(wù)派遣合同范本
- 農(nóng)村鄰里土地糾紛合同范本
- 加工定做設(shè)備合同范本
- 勞動(dòng)咨詢合同范本
- 《中國(guó)古代文學(xué)史及作品選II》教學(xué)大綱
- 代工生產(chǎn)合同范本
- 瑜伽課程合同轉(zhuǎn)讓協(xié)議書(shū)范本
- 個(gè)人經(jīng)營(yíng)性貸款合同模板
- 人教版英語(yǔ)2025七年級(jí)下冊(cè) Unit1Animal Friends教師版 語(yǔ)法講解+練習(xí)
- DeepSeek新手入門(mén)教程
- 課件:《教育強(qiáng)國(guó)建設(shè)規(guī)劃綱要(2024-2035年)》學(xué)習(xí)宣講
- 2025年山東化工職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年常考版參考題庫(kù)含答案解析
- 2025年全國(guó)幼兒園教師資格證考試教育理論知識(shí)押題試題庫(kù)及答案(共九套)
- 2024年鄭州電力高等??茖W(xué)校高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 產(chǎn)品試產(chǎn)流程
評(píng)論
0/150
提交評(píng)論