在node環境使用MySQL

什么是Sequelize?

Sequelize是一個基于Promise的NodeJS ORM模塊

什么是ORM?

ORM(Object-Relational-Mapping)是對象關系映射
對象關系映射可以把JS中的類和對象,和數據庫中的表和數據進行關系映射。映射之后我們就可以直接通過類和對象來操作數據表和數據了, 就不用編寫SQL語句了,ORM有效的解決了直接在NodeJS中編寫SQL不夠直觀, 不夠高效, 容易出錯等問題。

如何映射?

  • 在Sequelize中JS中的一個類(一個模型)就對應數據庫中的一張表
  • 在Sequelize中JS中的一個對象就對應表中的一條數據(一條記錄)
  • 在Sequelize中JS中的一個對象的屬性就對應一條數據的一個字段
|---------------------------|
|  id  |   name   |   age   |
|   1  |    zs    |    18   |
|   2  |    ls    |    19   |
|---------------------------|
// 1.創建一張表
cosnt 模型名稱 = Sequelize.define('表名', {id: int,name: varchar(255),age: int
})
// 2.創建一條記錄
let zs = 模型名稱.build({id: 1,name: zs,age: 18
})// 3.操作表和數據
只要是通過Sequelize定義的模型(), 那么Sequelize就會自動給這個模型添加很多操作表和數據的方法,以后我們就可以直接通過模型操作表, 通過模型創建出來的對象操作數據。

sequelize連接數據庫

// 1.導入Sequelize
const Sequelize = require('sequelize');
// 2.配置連接信息
/*
第一個參數: 要操作的數據庫名稱
第二個參數: 數據庫用戶名
第三個參數: 數據庫密碼
第四個參數: 其它的配置信息
* */
const sequelize = new Sequelize('demo', 'root', 'root', {host: '127.0.0.1', // MySQL服務器地址port: 3306, // MySQL服務器端口號// 注意點: Sequelize不僅僅能操作MySQL還能夠操作其它類型的數據庫dialect: 'mysql', // 告訴Sequelize當前要操作的數據庫類型pool: {max: 5, // 最多有多少個連接min: 0, // 最少有多少個連接idle: 10000, // 當前連接多久沒有操作就斷開acquire: 30000, // 多久沒有獲取到連接就斷開}
});// 3.測試配置是否正確
sequelize.authenticate()
.then(()=>{console.log('ok');
})
.catch((err)=>{console.log(err);
});

什么是數據庫連接池?

默認情況下有一個人要使用數據庫,那么就必須創建一個連接,默認情況下有一個人不用數據庫了, 為了不占用資源, 那么就必須銷毀一個連接。但是頻繁的創建和銷毀連接是非常消耗服務器性能的, 所以為了提升服務器性能就有了連接池。

數據庫連接池是負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個。
在這里插入圖片描述

sequelize創建表

  1. 字段說明常用屬性
  • type: 字段類型
  • primaryKey: 是否是主鍵
  • autoIncrement: 是否自動增長
  • allowNull: 是否允許為空
  • unique: 是否必須唯一
  • defaultValue: 默認值
  1. 額外配置常用屬性
  • timestamps: 是否自動添加createdAt/updateAt字段
  • freezeTableName: 是否禁止自動將表名修改為復用
  • tableName: 是否自定義表名,一般不用
  • indexes:
    [ // 指定索引{name: '', // 索引名稱fields: [''], // 索引字段名稱}
    ]
    

實例:

/*
sequelize.define();
第一個參數: 用于指定表的名稱
第二個參數: 用于指定表中有哪些字段
第三個參數: 用于配置表的一些額外信息
* */
/*
注意點:
1.sequelize在根據模型創建表的時候, 會自動將我們指定的表的名稱變成復數
2.sequelize在根據模型創建表的時候, 會自動增加兩個字段 createAt/updateAt
* */
let User = sequelize.define('user', {id: {type: Sequelize.INTEGER,primaryKey: true,autoIncrement: true},name: {type: Sequelize.STRING, // varchar(255)allowNull: false,unique: true},age: {type: Sequelize.TINYINT,defaultValue: 66},gender: {type: Sequelize.ENUM(['男', '女', '妖']),defaultValue: '妖'}
}, {freezeTableName: true, // 告訴sequelize不需要自動將表名變成復數// tableName: 'student', // 自定義表名,一般不用timestamps: false, // 不需要自動創建createAt/updateAt這兩個字段indexes: [ // 指定索引{name: 'idx_age', // 索引名稱fields: ['age'], // 索引字段名稱}]
});// 注意點: 默認定義好一個模型之后并不會自動創建對應的表,我們需要通過調用連接對象的sync方法來執行同步,只有同步之后才會自動根據模型創建對應的表
sequelize.sync();

crud

// 下面這段代碼 = 創建對象 + save();let u = await User.create({name: 'ww',age: 18,gender: '女'});console.log(u.dataValues);

在sequelize中,模型就代表著表,從表中查詢數據,即從模型中查詢數據:

 let u = await User.findByPk(2);console.log(u);
User.update({name: 'zs'
},{where: {id: 2}
})
User.destroy({where: {id: 3}
});
條件查詢
let us = await User.findAll({where: {// id: 1// age: {//     [Sequelize.Op.gte] : 33// },// id: 7// ------上面逗號分隔是并且關系,下面是或者關系[Sequelize.Op.or]: {age: 33,id: 7}}
});
console.log(us.map(u => u.dataValues));
分頁查詢和排序
// 分頁
let us = await User.findAll({offset: 2 // 跳過多少條數據});console.log(us.map(u => u.dataValues));let us = await User.findAll({limit: 2 // 取多少條數據});console.log(us.map(u => u.dataValues));let us = await User.findAll({offset: 2, // 跳過多少條數據limit: 2 // 取多少條數據});console.log(us.map(u => u.dataValues));// 排序let us = await User.findAll({order: [// ['id', 'desc']['age', 'desc'],['id', 'desc']]});console.log(us.map(u => u.dataValues));

Sequelize關聯查詢:

一對一

注意點:

  • 只要建立了人和書的關系, 那么在查詢人的時候, 就可以把擁有的那本書也查詢出來
  • 只要建立了書和人的關系, 那么在查詢書的時候, 就可以把書屬于哪個人也查詢出來
  • 如果沒有建立相關的關系, 那么就不能查詢出相關的內容
User.hasOne(Book, { // hasOne 誰擁有一個誰/ 一個人擁有一本書foreignKey: 'uId',sourceKey: 'id'});Book.belongsTo(User, { // belongsTo 誰屬于一個誰 / 一本書屬于一個人foreignKey: 'uId',sourceKey: 'id'});
let u = await User.findOne({where: {id: 1},// 注意點: 只要建立了表與表之間的關系, 那么在查詢人的時候,就可以把這個人擁有的那本書也查詢出來了include: {model: Book}
});
console.log(u.dataValues.book.dataValues);let b = await Book.findOne({where: {id: 1},// 注意點: 只要建立了表與表之間的關系, 那么在查詢書的時候,就可以把這本書屬于哪一個人也查詢出來了include: {model: User}
});
console.log(b.dataValues.user.dataValues);
一對多
User.hasMany(Book, { // 一個人擁有多本書foreignKey: 'uId',sourceKey: 'id'
});
Book.belongsTo(User, { // 一本書屬于一個人foreignKey: 'uId',sourceKey: 'id'
})
// 關聯查詢
let u = await User.findOne({where: {id: 1},include: {model: Book}
});
console.log(u.dataValues.books.map(b=>b.dataValues));let b = await Book.findOne({where: {id: 3},include: {model: User}
});
console.log(b.dataValues.user.dataValues);
多對多
 // 創建模型
let Student = sequelize.define('student', {id: {type: Sequelize.INTEGER,primaryKey: true,autoIncrement: true},name: {type: Sequelize.STRING, // varchar(255)allowNull: false,unique: true}
}, {freezeTableName: true, // 告訴sequelize不需要自動將表名變成復數// tableName: 'student', // 自定義表名timestamps: false // 不需要自動創建createAt/updateAt這兩個字段
});let Teacher = sequelize.define('teacher', {id: {type: Sequelize.INTEGER,primaryKey: true,autoIncrement: true},name: {type: Sequelize.STRING, // varchar(255)allowNull: false,unique: true}
}, {freezeTableName: true, // 告訴sequelize不需要自動將表名變成復數// tableName: 'student', // 自定義表名timestamps: false // 不需要自動創建createAt/updateAt這兩個字段
});let Relation = sequelize.define('relation', {studentId: {type: Sequelize.INTEGER,allowNull: false,references: {model: Student,key: 'id'}},teacherId: {type: Sequelize.INTEGER,allowNull: false,references: {model: Student,key: 'id'}}
}, {freezeTableName: true, // 告訴sequelize不需要自動將表名變成復數// tableName: 'student', // 自定義表名timestamps: false // 不需要自動創建createAt/updateAt這兩個字段
});
// 建立查詢關系
Student.belongsToMany(Teacher, { // 一個學生屬于多個老師through: Relation
});
Teacher.belongsToMany(Student, { // 一個老師屬于多個學生through: Relation
});sequelize.sync();
// 關聯查詢
/*
let s = await Student.findOne({where: {id: 1},include: {model: Teacher}
});
console.log(s.dataValues.teachers.map(t=>t.dataValues));*/
let t = await Teacher.findOne({where: {id: 1},include: {model: Student}
});
console.log(t);

Sequelize-Cli

什么是Sequelize-CLI?
  • 在編程開發中為了能夠更好的管理代碼, 我們可以使用Git來管理我們的代碼,
    實現對代碼變更的追蹤, 實現在各個不同版本之間切換
  • 在數據庫開發中為了能夠更好的管理數據庫, 我們也可以使用數據庫遷移工具來管理我們的數據庫,
    實現對數據庫變更的追蹤, 實現在各個不同版本之間切換
  • Sequelize-CLI就是一款數據庫遷移工具, 能夠讓我們追蹤數據庫的變更, 在各個不同版本之間隨意切換

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37389.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

join()方法——連接字符串、元組、列表和字典

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 語法參考 join()方法用于連接字符串數組。將字符串、元組、列表中的元素以指定的字符(分隔符)連接生成一個新的字符串&#…

喜報 | 極限科技獲得北京市“創新型”中小企業資格認證

2024年6月20日,北京市經濟和信息化局正式發布《關于對2024年度4月份北京市創新型中小企業名單進行公告的通知》,極限數據(北京)科技有限公司憑借其出色的創新能力和卓越的企業實力,成功獲得“北京市創新型中小企業”的…

學會python——在excel中寫入數據(python實例十三)

目錄 1.認識Python 2.環境與工具 2.1 python環境 2.2 Visual Studio Code編譯 3 .想Excel中寫入數據 3.1 代碼構思 3.2 代碼實例 3.3 運行結果 4.總結 1.認識Python Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。 Python 的設計具有很強的…

數據結構算法之B樹

一、緒論 1.1 數據結構的概念和作用 1.2 B樹的起源和應用領域 二、B樹的基本原理 2.1 B樹的定義和特點 2.2 B樹的結構和節點組成 2.3 B樹的插入 2.4 B樹的刪除操作 三、B樹的優勢和應用 3.1 B樹在數據庫系統中的應用 3.2 B樹在文件系統中的應用 3.3 B樹在內存管理中…

HTML5的多線程技術:Shared Worker的使用示例

Shared Worker 與普通的 Web Worker 類似,但不同之處在于它可以被多個瀏覽器窗口、標簽頁或者iframe共享,使得這些上下文之間能夠相互通信。下面是一個使用 Shared Worker 的完整示例。共享Worker腳本(sharedWorker.js) self.add…

isupper()方法——判斷字符串是否全由大寫字母組成

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 語法參考 isupper()方法用于判斷字符串中所有的字母是否都是大寫。isupper()方法的語法格式如下: str.isupper() 如果字符串中包含至少…

我是如何在bytemd中實現自定義目錄的

介紹 接著上文說完,實現了在markdown編輯器中插入視頻的能力,接下來還需要繼續優化 markdown文檔的閱讀體驗,比如 再加個目錄 熟悉markdown語法的朋友可能會說,直接在編輯時添加 toc 標簽,可以在文章頂部自動生成目錄…

實驗三 時序邏輯電路實驗

仿真 鏈接:https://pan.baidu.com/s/1z9KFQANyNF5PvUPPYFQ9Ow 提取碼:e3md 一、實驗目的 1、通過實驗,理解觸發的概念,理解JK、D等常見觸發器的功能; 2、通過實驗,加深集成計數器功能的理解,掌…

?Ollama的本地安裝?

先來逛一下咱們的主角Ollama的官網地址: Ollama 大概長這個樣子🤔 因為本地系統的原因,文章只提供Widows的安裝方式,使用Linux和Mac的大佬,可以自行摸索🧐 下載完成后就是安裝了🍕&#xff0c…

一、Redis簡介

一、Redis介紹與一般應用 1.1 基本了解 Redis全稱Remote Dictionary Server(遠程字典服務), 是一個開源的高性能鍵值存儲系統,通常用作數據庫、緩存和消息代理。使用ANSI C語言編寫遵守BSD協議,是一個高性能的Key-Value數據庫提供了豐富的數…

JVM性能監控與調優:生產環境的實踐指南

JVM性能監控與調優:生產環境的實踐指南 一、引言 在生產環境中,Java應用程序的性能監控和調優是確保系統穩定運行、提升用戶體驗的關鍵環節。JVM(Java Virtual Machine)作為Java應用程序的運行環境,其性能直接影響到…

Flink 本地任務添加配置參數

Flink 本地任務添加配置參數 配置一個Configuration,然后通過StreamExecutionEnvironment.getExecutionEnvironment(configuration)傳入。 例如: Configuration configuration new Configuration();configuration.set(RestartStrategyOptions.RESTART_…

蘋果筆記本能玩網頁游戲嗎 蘋果電腦玩steam游戲怎么樣 蘋果手機可以玩游戲嗎 mac電腦安裝windows

蘋果筆記本有著優雅的機身、強大的性能,每次更新迭代都備受用戶青睞。但是,當需要使用蘋果筆記本進行游戲時,很多人會有疑問:蘋果筆記本能玩網頁游戲嗎?蘋果筆記本適合打游戲嗎?本文將討論這兩個話題&#…

6-14題連接 - 高頻 SQL 50 題基礎版

目錄 1. 相關知識點2. 例子2.6. 使用唯一標識碼替換員工ID2.7- 產品銷售分析 I2.8 - 進店卻未進行過交易的顧客2.9 - 上升的溫度2.10 - 每臺機器的進程平均運行時間2.11- 員工獎金2.12-學生們參加各科測試的次數2.13-至少有5名直接下屬的經理2.14 - 確認率 1. 相關知識點 left …

JavaScript——屬性的檢測和枚舉

目錄 任務描述 相關知識 屬性的檢測 屬性的枚舉 編程要求 任務描述 本關任務:給定一個屬性的名字,請先判斷它屬于哪一個對象,然后返回該對象的所有自有屬性名連接成的字符串。 如:school對象有三個自有屬性name,location,s…

達夢數據庫系列—15. 表的備份和還原

目錄 1、表備份 2、表還原 1、表備份 表備份和表還原恢復,都必須在聯機狀態下進行。 與備份數據庫與表空間不同,不需要備份歸檔日志,不存在增量備份之說。 CREATE TABLE TAB_FOR_RES_02(C1 INT);CREATE INDEX I_TAB_FOR_RES_02 ON TAB_F…

樹狀數組——點修區查與區修點查

樹狀數組是一種代碼量小,維護區間的數據結構 他可以實現: 1.區間修改,單點查詢 2.單點修改,區間查詢 當然,二者不可兼得,大人全都要的話,請選擇線段樹 前置知識: lowbit(x)操作…

如何安裝和配置Monit

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站。 關于 Monit Monit 是一個有用的程序,可以自動監控和管理服務器程序,以確保它們不僅保持在線,而且文…

Java與前端框架集成開發指南

Java與前端框架集成開發指南 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 引言 在當今互聯網應用開發中,Java作為一種強大的后端語言&#xff0…

程序人生 - (002)

作為一名程序員,在編程和軟件開發的過程中,通常會有一些深刻的感悟和體會。這些感悟不僅僅是關于技術的,也包括對工作的態度、職業的發展和人生的理解。 代碼即邏輯:編寫代碼不僅僅是使用編程語言,更重要的是用邏輯思維…