新聞中心
本文來(lái)介紹 Sequelize,一個(gè)基于 Node.js 的 ORM(對(duì)象關(guān)系映射)工具,并詳細(xì)介紹其用法。Sequelize 用于在應(yīng)用中使用 JavaScript 來(lái)操作關(guān)系型數(shù)據(jù)庫(kù),例如 MySQL、PostgreSQL 等。本文內(nèi)容較多,可作為 Sequelize 的參考手冊(cè)來(lái)閱讀。

開始使用
核心概念
Sequelize 是一個(gè)基于 JavaScript 的 ORM(對(duì)象關(guān)系映射)庫(kù),用于在 Node.js 環(huán)境中與數(shù)據(jù)庫(kù)進(jìn)行交互。它提供了一種方便、靈活的方式來(lái)管理數(shù)據(jù)庫(kù),并將數(shù)據(jù)庫(kù)表映射為對(duì)象,使開發(fā)人員可以使用面向?qū)ο蟮木幊田L(fēng)格來(lái)操作數(shù)據(jù)庫(kù)。
ORM(對(duì)象關(guān)系映射)是一種編程技術(shù),用于通過(guò)將對(duì)象和數(shù)據(jù)庫(kù)表之間建立映射關(guān)系,以更直觀的方式進(jìn)行數(shù)據(jù)庫(kù)操作。Sequelize 通過(guò)將數(shù)據(jù)庫(kù)記錄映射為模型對(duì)象,使得開發(fā)人員可以使用 JavaScript 對(duì)象的方法和屬性來(lái)進(jìn)行數(shù)據(jù)庫(kù)的增刪改查操作,而不需要編寫復(fù)雜的 SQL 查詢語(yǔ)句。
Sequelize 支持多種數(shù)據(jù)庫(kù),包括 MySQL、PostgreSQL、SQLite 和 MSSQL 等,可以適應(yīng)各種不同的項(xiàng)目需求。它提供了豐富的功能,包括模型定義、關(guān)聯(lián)關(guān)系、事務(wù)處理、查詢構(gòu)建器等,可以幫助開發(fā)人員高效地進(jìn)行數(shù)據(jù)庫(kù)操作。
使用 Sequelize,開發(fā)人員可以輕松地進(jìn)行數(shù)據(jù)庫(kù)遷移、執(zhí)行復(fù)雜的查詢和聚合操作,并實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)和驗(yàn)證等功能。此外,它還提供了鉤子函數(shù)、事件觸發(fā)和數(shù)據(jù)庫(kù)連接池等功能,以優(yōu)化數(shù)據(jù)庫(kù)訪問(wèn)性能。
基本使用
要使用 Sequelize 來(lái)連接 MySQL 數(shù)據(jù)庫(kù),需要進(jìn)行以下步驟:
- 安裝 Sequelize 和 MySQL 驅(qū)動(dòng)程序:
- 使用 npm 運(yùn)行以下命令來(lái)安裝 Sequelize:npm install sequelize
- 安裝 MySQL:npm install mysql2
- 創(chuàng)建 Sequelize 實(shí)例和數(shù)據(jù)庫(kù)連接:
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql',
});這里需要將 'database'、'username' 和 'password' 分別替換為 MySQL 數(shù)據(jù)庫(kù)的名稱、用戶名和密碼。還可以根據(jù)需要設(shè)置其他連接選項(xiàng),例如 host 和 port。
- 定義模型:
const User = sequelize.define('User', {
username: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
},
},
// 其他屬性和選項(xiàng)
});這里定義了一個(gè)名為 User 的模型,包含 username 和 email 屬性。
- 進(jìn)行數(shù)據(jù)庫(kù)操作:
async function createUser() {
await sequelize.sync(); // 同步模型和數(shù)據(jù)庫(kù)
const user = await User.create({ username: 'John', email: '[email protected]' });
console.log(user.toJSON());
}
createUser().catch(console.error);這里首先調(diào)用 sequelize.sync() 方法來(lái)同步模型和數(shù)據(jù)庫(kù),以確保模型在數(shù)據(jù)庫(kù)中存在。然后使用 User.create() 方法創(chuàng)建一個(gè)新用戶,并輸出其序列化后的 JSON 數(shù)據(jù)。
這只是 Sequelize 連接 MySQL 的基本用法,你還可以使用 Sequelize 提供的其他方法來(lái)執(zhí)行查詢、更新、刪除等操作,以及定義模型之間的關(guān)聯(lián)關(guān)系。下面會(huì)詳細(xì)介紹!
模型定義
在 Sequelize 中,模型(Model)是一種表示數(shù)據(jù)庫(kù)表結(jié)構(gòu)的抽象化概念。它定義了數(shù)據(jù)表的結(jié)構(gòu)和行為,包括表名、字段、關(guān)聯(lián)關(guān)系、數(shù)據(jù)校驗(yàn)規(guī)則等。
Sequelize 模型允許通過(guò)編寫模型類來(lái)操作數(shù)據(jù)庫(kù)表,封裝了對(duì)數(shù)據(jù)庫(kù)的增刪改查等操作。每個(gè)模型類對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)表,并且模型類的實(shí)例代表數(shù)據(jù)庫(kù)表中的一條記錄。
創(chuàng)建模型
定義模型方法
可以使用sequelize.define() 方法來(lái)創(chuàng)建模型,它用于定義和創(chuàng)建模型,其基本語(yǔ)法如下:
sequelize.define(modelName, attributes, options)參數(shù)說(shuō)明:
- modelName:模型的名稱。
- attributes:模型的屬性定義,一個(gè)包含列名和數(shù)據(jù)類型的對(duì)象。
- options:模型的其他選項(xiàng),例如表名、時(shí)間戳等。
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password');
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
username: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
},
},
createdAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
},
}, {
tableName: 'users',
timestamps: true,
});
// 創(chuàng)建用戶實(shí)例
User.create({ username: 'John', email: '[email protected]' })
.then((user) => {
console.log(user.toJSON());
})
.catch(console.error);這里使用 sequelize.define() 方法定義了一個(gè)名為 User 的模型。模型具有 id、username、email、createdAt 和 updatedAt 等屬性。我們還指定了表名為 'users',以及啟用了時(shí)間戳屬性。
定義模型步驟
在 Sequelize 中,創(chuàng)建模型的步驟如下:
- 配置 Sequelize 實(shí)例連接數(shù)據(jù)庫(kù),確定數(shù)據(jù)庫(kù)的相關(guān)信息。
- 使用 sequelize.define 方法定義模型,并指定模型的名稱、字段和其他選項(xiàng)。
- 通過(guò)調(diào)用模型的 sync 方法將模型同步到數(shù)據(jù)庫(kù)中。
const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
// 配置數(shù)據(jù)庫(kù)連接信息
});
// 定義模型
const User = sequelize.define('User', {
name: Sequelize.STRING,
email: Sequelize.STRING,
age: Sequelize.INTEGER,
});
// 同步模型到數(shù)據(jù)庫(kù)
(async () => {
try {
await sequelize.sync();
console.log('模型創(chuàng)建成功!');
} catch (error) {
console.error('模型創(chuàng)建失?。?, error);
} finally {
sequelize.close(); // 關(guān)閉數(shù)據(jù)庫(kù)連接
}
})();記得在最后關(guān)閉 Sequelize 連接,避免資源泄漏。
注意,模型創(chuàng)建后只需調(diào)用 sequelize.sync 方法進(jìn)行同步一次即可,后續(xù)對(duì)模型的修改不會(huì)自動(dòng)同步到數(shù)據(jù)庫(kù)。如果想要更新現(xiàn)有的模型定義,可以使用 Sequelize 提供的遷移工具或手動(dòng)修改數(shù)據(jù)庫(kù)表結(jié)構(gòu)。
定義模型參數(shù)
上面的例子只定義了字段的類型,其實(shí)還有很多屬性可以定義,下面來(lái)看一個(gè)例子:
const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
// 配置數(shù)據(jù)庫(kù)連接信息
});
const User = sequelize.define('User', {
name: {
type: Sequelize.STRING,
allowNull: false,
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
},
},
age: {
type: Sequelize.INTEGER,
allowNull: false,
defaultValue: 0,
validate: {
min: 0,
},
},
});在字段定義對(duì)象中,每個(gè)屬性表示一個(gè)字段。屬性的名稱是字段的名稱,屬性的值是字段的配置。下面來(lái)分別看看這些字段值。
type:參數(shù)類型
type 屬性用于指定模型字段的數(shù)據(jù)類型。以下是一些常見的數(shù)據(jù)類型選項(xiàng):
- STRING:字符串類型。
- CHAR:字符型,允許存儲(chǔ)固定長(zhǎng)度的字符串。
- TEXT:文本類型,適用于存儲(chǔ)大段文本數(shù)據(jù)。
- INTEGER:整數(shù)類型。
- BIGINT:大整數(shù)類型。
- FLOAT:浮點(diǎn)數(shù)類型。
- DOUBLE:雙精度浮點(diǎn)數(shù)類型。
- DECIMAL:十進(jìn)制數(shù)類型。
- BOOLEAN:布爾類型。
- DATE:日期類型,不包括時(shí)間。
- TIME:時(shí)間類型,不包括日期。
- DATEONLY:僅日期類型。
- DATETIME:日期和時(shí)間類型。
- BLOB:二進(jìn)制大對(duì)象類型,適用于存儲(chǔ)二進(jìn)制數(shù)據(jù)。
- UUID:通用唯一識(shí)別碼類型。
此外,Sequelize 還支持將數(shù)據(jù)類型與修飾符結(jié)合使用,以提供更豐富的數(shù)據(jù)定義選項(xiàng)。例如:
- STRING(100):指定字符串類型的最大長(zhǎng)度為 100 個(gè)字符。
- INTEGER.UNSIGNED:指定無(wú)符號(hào)整數(shù)類型。
- DECIMAL(10, 2):指定十進(jìn)制數(shù)類型,并設(shè)置總共10位數(shù),其中包含2位小數(shù)。
數(shù)字類型
在 Sequelize 中,數(shù)字類型包括以下幾種:
- INTEGER:表示整數(shù)類型??梢允褂?nbsp;Sequelize.INTEGER 或 Sequelize.INTEGER(n) 來(lái)定義,其中 n 是整數(shù)的位數(shù)。
- BIGINT:表示長(zhǎng)整數(shù)類型??梢允褂?nbsp;Sequelize.BIGINT 或 Sequelize.BIGINT(n) 來(lái)定義,其中 n 是長(zhǎng)整數(shù)的位數(shù)。
- FLOAT:表示單精度浮點(diǎn)數(shù)類型??梢允褂?nbsp;Sequelize.FLOAT 或 Sequelize.FLOAT(n, m) 來(lái)定義,其中 n 是總位數(shù),m 是小數(shù)部分的位數(shù)。
- DOUBLE:表示雙精度浮點(diǎn)數(shù)類型??梢允褂?nbsp;Sequelize.DOUBLE 或 Sequelize.DOUBLE(n, m) 來(lái)定義,其中 n 是總位數(shù),m 是小數(shù)部分的位數(shù)。
- DECIMAL:表示任意精度的十進(jìn)制數(shù)類型??梢允褂?nbsp;Sequelize.DECIMAL 或 Sequelize.DECIMAL(n, m) 來(lái)定義,其中 n 是總位數(shù),m 是小數(shù)部分的位數(shù)。
字符串類型
在 Sequelize 中,字符串類型有以下幾種選項(xiàng)可供選擇:
- STRING:表示普通的字符串類型。可以使用 Sequelize.STRING 來(lái)定義,默認(rèn)最大長(zhǎng)度為 255 個(gè)字符。
- CHAR:表示定長(zhǎng)的字符串類型。你可以指定最大長(zhǎng)度作為選項(xiàng)??梢允褂?nbsp;Sequelize.CHAR(length) 來(lái)定義,其中 length 是字符串的最大長(zhǎng)度。
- TEXT:表示長(zhǎng)文本類型??梢源鎯?chǔ)更大長(zhǎng)度的文本數(shù)據(jù)??梢允褂?nbsp;Sequelize.TEXT 來(lái)定義。
- UUID:表示 UUID 字符串類型,用于存儲(chǔ)全局唯一標(biāo)識(shí)符??梢允褂?nbsp;Sequelize.UUID 來(lái)定義。
- ENUM:表示枚舉類型,用于存儲(chǔ)預(yù)定義的選項(xiàng)列表中的一個(gè)值。需要提供一個(gè)選項(xiàng)數(shù)組作為參數(shù)。可以使用 Sequelize.ENUM(values) 來(lái)定義,其中 values 是枚舉選項(xiàng)的數(shù)組。
- JSON:表示存儲(chǔ) JSON 數(shù)據(jù)的字符串類型。可以使用 Sequelize.JSON 來(lái)定義。
- JSONB:表示存儲(chǔ) JSONB(二進(jìn)制格式的 JSON)數(shù)據(jù)的字符串類型(僅支持 PostgreSQL)。可以使用 Sequelize.JSONB 來(lái)定義。
日期類型
在 Sequelize 中,日期類型包括以下幾種:
- DATE:表示日期類型,不包含時(shí)間??梢允褂?nbsp;Sequelize.DATE 來(lái)定義。
- TIME:表示時(shí)間類型,不包含日期。可以使用 Sequelize.TIME 來(lái)定義。
- DATETIME:表示日期和時(shí)間類型??梢允褂?nbsp;Sequelize.DATE 或 Sequelize.DATETIME 來(lái)定義。
- NOW:表示當(dāng)前時(shí)間??梢允褂?nbsp;Sequelize.NOW 來(lái)獲取當(dāng)前時(shí)間的值。
- DATEONLY:表示只包含日期的類型,不包含時(shí)間??梢允褂?nbsp;Sequelize.DATEONLY 來(lái)定義。
- SMALLDATETIME:表示包含日期和時(shí)間的類型,時(shí)間精度較低。可以使用 Sequelize.SMALLDATETIME 來(lái)定義。
- TIMESTAMP:表示包含日期和時(shí)間的類型,時(shí)間精度高于 SMALLDATETIME??梢允褂?nbsp;Sequelize.TIMESTAMP 來(lái)定義。
UUID類型
在 Sequelize 中,UUID 類型用于表示一個(gè)全局唯一的標(biāo)識(shí)符。Sequelize 支持以下幾種 UUID 類型:
- UUID:表示標(biāo)準(zhǔn) UUID 字符串,長(zhǎng)度為 36 個(gè)字符。可以使用 Sequelize.UUID 來(lái)定義。
- UUIDV1:表示基于時(shí)間戳和 MAC 地址生成的 UUID 字符串??梢允褂?nbsp;Sequelize.UUIDV1 來(lái)獲取該類型的默認(rèn)值。
- UUIDV4:表示隨機(jī)生成的 UUID 字符串。可以使用 Sequelize.UUIDV4 來(lái)獲取該類型的默認(rèn)值。
allowNull:是否可以為空
allowNull 是 Sequelize 中用于定義模型字段是否允許為空的屬性選項(xiàng)。
當(dāng) allowNull 設(shè)置為 true 時(shí),表示該字段允許為空。這意味著在創(chuàng)建記錄或更新記錄時(shí),可以將該字段設(shè)置為空值(null)。如果設(shè)置為 false,表示該字段不能為空。
defaultValue:默認(rèn)值
defaultValue 用于定義模型字段默認(rèn)值的屬性選項(xiàng)。
當(dāng)創(chuàng)建記錄時(shí),如果沒(méi)有提供該字段的值,則會(huì)使用 defaultValue 屬性定義的默認(rèn)值。
primaryKey:主鍵值
primaryKey 是用于指定模型字段作為主鍵的屬性選項(xiàng)。
主鍵是數(shù)據(jù)庫(kù)表中的一種特殊字段,它用于唯一標(biāo)識(shí)表中的每一行記錄。主鍵字段的值在整個(gè)表中必須是唯一的,并且不能為空。通過(guò)將 primaryKey 設(shè)置為 true,可以指示 Sequelize 將該字段設(shè)置為模型的主鍵。
autoIncrement:自增字段
autoIncrement 是一個(gè)用于指定模型字段是否為自增字段的屬性選項(xiàng)。
自增字段是一種特殊類型的主鍵,它的值會(huì)在每次插入新記錄時(shí)自動(dòng)遞增。通常用于為每個(gè)新記錄分配唯一的標(biāo)識(shí)符。自增字段的常見類型為整數(shù)(例如,INTEGER)。通過(guò)將 autoIncrement 設(shè)置為 true,可以指示 Sequelize 將該字段設(shè)置為自增字段。
使用自增字段可以方便地生成唯一的標(biāo)識(shí)符,而無(wú)需顯式指定每個(gè)新記錄的值。數(shù)據(jù)庫(kù)在插入新記錄時(shí)會(huì)自動(dòng)遞增該字段的值。這對(duì)于需要快速添加新記錄并確保主鍵唯一性的情況非常有用。
注意,autoIncrement 屬性僅對(duì)整數(shù)類型的字段有效。
unique:是否唯一
unique 用于定義模型字段是否唯一的屬性選項(xiàng)。
當(dāng)將 unique 設(shè)置為 true 時(shí),表示該字段的值必須在整個(gè)表中是唯一的。也就是說(shuō),在同一列中,每個(gè)記錄都必須有一個(gè)唯一的值,不能重復(fù)。
validate:校驗(yàn)規(guī)則
validate 是用于定義模型字段驗(yàn)證規(guī)則的屬性選項(xiàng)。
通過(guò) validate 屬性,可以定義一個(gè)包含驗(yàn)證規(guī)則的對(duì)象,用于驗(yàn)證模型字段的值是否符合指定的條件。validate 屬性可以包含多個(gè)驗(yàn)證規(guī)則,每個(gè)規(guī)則可以是一個(gè)函數(shù)或一個(gè)對(duì)象。下面是一些常見的驗(yàn)證規(guī)則屬性值:
- notEmpty:確保字段的值不為空。
- len:檢查字段的長(zhǎng)度是否在指定范圍內(nèi)??梢栽O(shè)置一個(gè)數(shù)組,如 [min, max]。
- isEmail:驗(yàn)證字段的值是否為有效的電子郵件地址。
- isUrl:驗(yàn)證字段的值是否為有效的 URL。
- isAlpha:驗(yàn)證字段的值是否只包含字母字符。
- isAlphanumeric:驗(yàn)證字段的值是否只包含字母和數(shù)字字符。
- isNumeric:驗(yàn)證字段的值是否為數(shù)字。
- isInt:驗(yàn)證字段的值是否為整數(shù)。
- isFloat:驗(yàn)證字段的值是否為浮點(diǎn)數(shù)。
- isDate:驗(yàn)證字段的值是否為有效的日期。
- isAfter:驗(yàn)證字段的值是否在指定日期之后。
- isBefore:驗(yàn)證字段的值是否在指定日期之前。
- isIn:驗(yàn)證字段的值是否在指定的數(shù)組中。
這只是一些常見的驗(yàn)證規(guī)則,Sequelize 還提供了更多的內(nèi)置驗(yàn)證規(guī)則。此外,你還可以定義自定義的驗(yàn)證函數(shù)來(lái)進(jìn)行復(fù)雜的驗(yàn)證邏輯。
const User = sequelize.define('User', {
username: {
type: Sequelize.STRING,
allowNull: false,
validate: {
notEmpty: true,
len: [3, 20],
isAlphanumeric: true,
},
},
email: {
type: Sequelize.STRING,
allowNull: false,
validate: {
isEmail: true,
},
},
});comment:注釋
comment 是用于為模型字段添加注釋的屬性選項(xiàng)。
注釋是對(duì)字段的描述性文本,可以提供關(guān)于字段用途、含義或其他相關(guān)信息的補(bǔ)充說(shuō)明。注釋對(duì)于理解和維護(hù)數(shù)據(jù)庫(kù)結(jié)構(gòu)非常有幫助。
const User = sequelize.define('User', {
username: {
type: Sequelize.STRING,
comment: '用戶的用戶名', // 字段注釋
},
email: {
type: Sequelize.STRING,
comment: '用戶的電子郵件地址', // 字段注釋
},
});field:字段重命名
field 是一個(gè)用于指定模型字段在數(shù)據(jù)庫(kù)中的實(shí)際名稱的屬性選項(xiàng)。
默認(rèn)情況下,Sequelize 會(huì)將模型定義中的字段名稱直接映射到數(shù)據(jù)庫(kù)表中對(duì)應(yīng)的列名。但是,有時(shí)可能希望在數(shù)據(jù)庫(kù)中使用不同的列名,這時(shí)可以使用 field 屬性來(lái)指定實(shí)際的數(shù)據(jù)庫(kù)列名。
const User = sequelize.define('User', {
firstName: {
type: Sequelize.STRING,
field: 'first_name', // 指定數(shù)據(jù)庫(kù)對(duì)應(yīng)的列名
},
lastName: {
type: Sequelize.STRING,
field: 'last_name', // 指定數(shù)據(jù)庫(kù)對(duì)應(yīng)的列名
},
});在上述示例中,firstName 字段的 field 屬性設(shè)置為 first_name,lastName 字段的 field 屬性設(shè)置為 last_name。這將導(dǎo)致在數(shù)據(jù)庫(kù)表中創(chuàng)建名為 first_name和last_name 的列。
使用 field 屬性可以非常靈活地控制模型字段與數(shù)據(jù)庫(kù)列的映射關(guān)系。這在需要與遺留數(shù)據(jù)庫(kù)或特定數(shù)據(jù)庫(kù)命名約定交互的情況下非常有用。
注意,如果不指定 field 屬性,Sequelize 將默認(rèn)使用與模型字段名稱相同的列名。
get 和 set:字段值計(jì)算
get
get 字段表示一個(gè)自定義的 getter 方法。它是一個(gè)通過(guò)訪問(wèn)模型實(shí)例屬性來(lái)獲取計(jì)算值的函數(shù)。
使用 get 字段,可以定義一個(gè)自定義的 getter 方法,該方法會(huì)在訪問(wèn)特定屬性時(shí)被調(diào)用,以便根據(jù)需要對(duì)屬性進(jìn)行計(jì)算、處理或轉(zhuǎn)換。
const User = sequelize.define('User', {
firstName: {
type: Sequelize.STRING,
allowNull: false,
},
lastName: {
type: Sequelize.STRING,
allowNull: false,
},
fullName: {
type: Sequelize.VIRTUAL, // 虛擬屬性
get() {
return `${this.firstName} ${this.lastName}`;
},
},
});
const user = User.build({
firstName: 'Alice',
lastName: 'Smith',
});
console.log(user.fullName); // 輸出:Alice Smith使用 get 字段可以方便地在訪問(wèn)模型屬性時(shí)進(jìn)行額外的計(jì)算或處理。它使得模型實(shí)例的屬性具有更多的靈活性和復(fù)雜性。
set
set 字段表示一個(gè)自定義的 setter 方法。它允許你在設(shè)置屬性值時(shí)執(zhí)行一些自定義邏輯或轉(zhuǎn)換。
使用 set 字段,可以定義一個(gè)自定義的 setter 方法,該方法會(huì)在設(shè)置特定屬性的值時(shí)被調(diào)用,以便對(duì)該值進(jìn)行處理、驗(yàn)證或轉(zhuǎn)換。
const User = sequelize.define('User', {
fullName: {
type: Sequelize.STRING,
set(value) {
const names = value.split(' ');
this.setDataValue('firstName', names[0]);
this.setDataValue('lastName', names[1]);
},
},
});
const user = User.build();
user.fullName = 'Alice Smith';
console.log(user.firstName); // 輸出:Alice
console.log(user.lastName); // 輸出:Smith當(dāng)給 user.fullName 賦值時(shí),Sequelize 將自動(dòng)調(diào)用定義的 setter 方法,并進(jìn)行相應(yīng)的屬性設(shè)置。
使用 set 字段可以方便地在設(shè)置模型屬性值時(shí)執(zhí)行自定義的邏輯或轉(zhuǎn)換操作。它使得模型屬性的賦值具有更多的靈活性和復(fù)雜性。
references:模型關(guān)聯(lián)
references 是一個(gè)模型定義中的選項(xiàng),用于指定關(guān)聯(lián)關(guān)系中引用的目標(biāo)模型和目標(biāo)屬性。
當(dāng)在 Sequelize 模型定義中使用 references 選項(xiàng),它表示當(dāng)前模型與另一個(gè)模型之間的關(guān)聯(lián)關(guān)系,并指定了相關(guān)聯(lián)的目標(biāo)模型和目標(biāo)屬性。
const User = sequelize.define('User', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
username: {
type: Sequelize.STRING,
allowNull: false,
},
});
const Post = sequelize.define('Post', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
title: {
type: Sequelize.STRING,
allowNull: false,
},
userId: {
type: Sequelize.INTEGER,
references: {
model: User, // 引用的目標(biāo)模型
key: 'id', // 引用的目標(biāo)屬性
},
},
});這里定義了兩個(gè)模型:User 和 Post。在 Post 模型的定義中,使用了 references 選項(xiàng)來(lái)創(chuàng)建一個(gè)與 User 模型的關(guān)聯(lián)關(guān)系。
references 選項(xiàng)包含兩個(gè)屬性:
- model:指定關(guān)聯(lián)的目標(biāo)模型,這里是 User。
- key:指定關(guān)聯(lián)的目標(biāo)屬性,這里是 id。
這意味著 Post 模型中的 userId 屬性將引用 User 模型中的 id 屬性作為關(guān)聯(lián)。這意味著 userId 和 User 模型的 id 屬性具有相同的值。
通過(guò)使用 references 選項(xiàng),Sequelize 可以根據(jù)關(guān)聯(lián)關(guān)系設(shè)置合適的數(shù)據(jù)庫(kù)約束,并幫助你在查詢中輕松處理模型之間的關(guān)聯(lián)。
onDelete:刪除關(guān)聯(lián)
onDelete 是一個(gè)定義關(guān)聯(lián)關(guān)系時(shí)可以設(shè)置的選項(xiàng)之一。它用于指定當(dāng)關(guān)聯(lián)模型的記錄被刪除時(shí)要執(zhí)行的操作。
使用 onDelete 選項(xiàng),可以定義在刪除關(guān)聯(lián)模型的記錄時(shí)應(yīng)該執(zhí)行的操作,例如級(jí)聯(lián)刪除、設(shè)置為 null 或什么都不做等。
以下是一些常用的 onDelete 選項(xiàng)值及其含義:
- CASCADE:級(jí)聯(lián)刪除。當(dāng)關(guān)聯(lián)模型的記錄被刪除時(shí),與之關(guān)聯(lián)的記錄也將被刪除。
- SET NULL:設(shè)置為 null。當(dāng)關(guān)聯(lián)模型的記錄被刪除時(shí),與之關(guān)聯(lián)的記錄的外鍵值將被設(shè)置為 null。
- SET DEFAULT:設(shè)置為默認(rèn)值。當(dāng)關(guān)聯(lián)模型的記錄被刪除時(shí),與之關(guān)聯(lián)的記錄的外鍵值將被設(shè)置為默認(rèn)值。
- RESTRICT:限制。當(dāng)關(guān)聯(lián)模型的記錄被刪除時(shí),如果還有與之關(guān)聯(lián)的記錄存在,則會(huì)阻止刪除操作。
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true
}
});
const Post = sequelize.define('Post', {
id: {
type: DataTypes.INTEGER,
primaryKey: true
},
userId: {
type: DataTypes.INTEGER,
references: {
model: User,
key: 'id'
},
onDelete: 'CASCADE' // 當(dāng)關(guān)聯(lián)的 User 記錄被刪除時(shí),與之關(guān)聯(lián)的 Post 記錄也將被刪除
}
});這里定義了一個(gè) User 模型和一個(gè) Post 模型。在 Post 模型的定義中,我們?cè)O(shè)置了與 User 模型的關(guān)聯(lián),并在 userId 屬性上使用了 onDelete: 'CASCADE' 選項(xiàng)。這意味著當(dāng)與之關(guān)聯(lián)的 User 記錄被刪除時(shí),與之關(guān)聯(lián)的 Post 記錄也將被級(jí)聯(lián)刪除。
onUpdate:更新關(guān)聯(lián)
onUpdate 是一個(gè)定義關(guān)聯(lián)關(guān)系時(shí)可以設(shè)置的選項(xiàng)之一。它用于指定當(dāng)關(guān)聯(lián)模型的記錄被更新時(shí)要執(zhí)行的操作。
使用 onUpdate 選項(xiàng),可以定義在更新關(guān)聯(lián)模型的記錄時(shí)應(yīng)該執(zhí)行的操作,例如級(jí)聯(lián)更新或什么都不做等。
以下是一些常用的 onUpdate 選項(xiàng)值及其含義:
- CASCADE:級(jí)聯(lián)更新。當(dāng)關(guān)聯(lián)模型的記錄被更新時(shí),與之關(guān)聯(lián)的記錄也將相應(yīng)地進(jìn)行更新。
- SET NULL:設(shè)置為 null。當(dāng)關(guān)聯(lián)模型的記錄被更新時(shí),與之關(guān)聯(lián)的記錄的外鍵值將被設(shè)置為 null。
- SET DEFAULT:設(shè)置為默認(rèn)值。當(dāng)關(guān)聯(lián)模型的記錄被更新時(shí),與之關(guān)聯(lián)的記錄的外鍵值將被設(shè)置為默認(rèn)值。
- RESTRICT:限制。當(dāng)關(guān)聯(lián)模型的記錄被更新時(shí),如果有其他關(guān)聯(lián)記錄存在,則會(huì)阻止更新操作。
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true
}
});
const Post = sequelize.define('Post', {
id: {
type: DataTypes.INTEGER,
primaryKey: true
},
userId: {
type: DataTypes.INTEGER,
references: {
model: User,
key: 'id'
},
onUpdate: 'CASCADE' // 當(dāng)關(guān)聯(lián)的 User 記錄被更新時(shí),與之關(guān)聯(lián)的 Post 記錄也將被相應(yīng)地更新
}
});這里定義了一個(gè) User 模型和一個(gè) Post 模型。在 Post 模型的定義中,我們?cè)O(shè)置了與 User 模型的關(guān)聯(lián),并在 userId 屬性上使用了 onUpdate: 'CASCADE' 選項(xiàng)。這意味著當(dāng)與之關(guān)聯(lián)的 User 記錄被更新時(shí),與之關(guān)聯(lián)的 Post 記錄也將相應(yīng)地進(jìn)行級(jí)聯(lián)更新。
模型繼承
模型繼承是一種將一個(gè)模型繼承自另一個(gè)模型的機(jī)制。這使得你可以從一個(gè)已有的模型中派生出新的模型,并繼承它的屬性、方法和關(guān)聯(lián)關(guān)系,從而實(shí)現(xiàn)代碼重用和模型的層次結(jié)構(gòu)組織。
模型繼承通過(guò)使用 sequelize.define() 方法的 options 參數(shù)來(lái)實(shí)現(xiàn)。在定義模型時(shí),可以指定 options 參數(shù)中的 extend 屬性,來(lái)指定該模型繼承自哪個(gè)父模型。被繼承的父模型稱為基礎(chǔ)(或父)模型,而繼承的新模型稱為派生(或子)模型。
下面來(lái)看看如何在 Sequelize 中進(jìn)行模型繼承:
const { Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password');
// 定義基礎(chǔ)模型
const BaseModel = sequelize.define('base', {
name: {
type: DataTypes.STRING,
allowNull: false,
},
// 其他屬性...
});
// 定義派生模型,并繼承基礎(chǔ)模型
const DerivedModel = sequelize.define('derived', {
age: {
type: DataTypes.INTEGER,
allowNull: false,
},
// 其他屬性...
}, {
extend: BaseModel,
});
// 創(chuàng)建派生模型的實(shí)例
DerivedModel.create({ name: 'John', age: 25 })
.then((instance) => {
console.log(instance.toJSON());
})
.catch(console.error);這里首先定義了一個(gè)基礎(chǔ)模型 BaseModel,它有一個(gè)名為 name 的屬性。然后,定義了派生模型 DerivedModel,它繼承自基礎(chǔ)模型,并新增了一個(gè)名為 age 的屬性。最后,我們使用派生模型的 create() 方法創(chuàng)建一個(gè)新的實(shí)例,并輸出其序列化后的 JSON 數(shù)據(jù)。
通過(guò)模型繼承,可以在派生模型中重用和擴(kuò)展基礎(chǔ)模型的屬性、方法和關(guān)聯(lián)關(guān)系,從而簡(jiǎn)化代碼的編寫和維護(hù)。這對(duì)于構(gòu)建具有層次結(jié)構(gòu)的數(shù)據(jù)模型非常有用,例如用戶、管理員和超級(jí)管理員之間的繼承關(guān)系。
修改模型
在 Sequelize 中,修改、刪除已有字段或新增字段的過(guò)程如下:
- 在模型定義中進(jìn)行相應(yīng)的更改。
- 使用 Sequelize 提供的遷移工具執(zhí)行數(shù)據(jù)庫(kù)遷移操作。
過(guò)程如下:
- 修改已有字段的數(shù)據(jù)類型和屬性:
// 修改已有字段的數(shù)據(jù)類型和屬性
await sequelize.queryInterface.changeColumn('User', 'age', {
type: Sequelize.STRING,
allowNull: true,
});- 刪除已有字段:
// 刪除已有字段
await sequelize.queryInterface.removeColumn('User', 'age');- 新增字段:
{
// 新增字段
await sequelize.queryInterface.addColumn('User', 'gender', {
type: Sequelize.STRING,
allowNull: true,
});這里用 Sequelize 提供的 queryInterface 對(duì)象來(lái)執(zhí)行數(shù)據(jù)庫(kù)遷移操作。該對(duì)象提供了一系列方法來(lái)修改表結(jié)構(gòu)。
- 對(duì)于修改已有字段,可以使用 changeColumn 方法指定要更改的模型名稱、字段名稱和新的屬性。
- 對(duì)于刪除已有字段,可以使用 removeColumn 方法指定要?jiǎng)h除的模型名稱和字段名稱。
- 對(duì)于新增字段,我們可以使用 addColumn 方法指定要新增字段的模型名稱、字段名稱和屬性。
在 Sequelize 中,修改模型定義并執(zhí)行相應(yīng)的遷移操作后,默認(rèn)情況下數(shù)據(jù)庫(kù)表不會(huì)自動(dòng)同步更改。你需要顯式地調(diào)用 sequelize.sync 方法來(lái)同步模型和數(shù)據(jù)庫(kù)表。以下是一個(gè)在執(zhí)行遷移操作后手動(dòng)調(diào)用 sequelize.sync 方法的示例代碼:
// 執(zhí)行遷移操作...
// ...
// 手動(dòng)同步模型和數(shù)據(jù)庫(kù)表
await sequelize.sync();這里使用 await sequelize.sync() 方法手動(dòng)同步模型和數(shù)據(jù)庫(kù)表。這將更新數(shù)據(jù)庫(kù)表結(jié)構(gòu)以匹配模型定義的更改。
注意,sequelize.sync() 方法會(huì)根據(jù)模型定義生成創(chuàng)建、修改或刪除表的 SQL 命令,然后將其應(yīng)用于數(shù)據(jù)庫(kù)。因此,請(qǐng)確保在生產(chǎn)環(huán)境中謹(jǐn)慎使用該方法,并提前備份重要的數(shù)據(jù)。
如果使用 Sequelize-CLI 或其他遷移工具來(lái)管理數(shù)據(jù)庫(kù)遷移,它們通常會(huì)自動(dòng)處理模型與數(shù)據(jù)庫(kù)表的同步操作,你不需要手動(dòng)調(diào)用 sequelize.sync() 方法。但如果你手動(dòng)修改了模型定義或直接使用 queryInterface 修改數(shù)據(jù)庫(kù)表結(jié)構(gòu),則需要手動(dòng)同步模型和數(shù)據(jù)庫(kù)表。
刪除模型
要?jiǎng)h除 Sequelize 中的模型,可以使用 sequelize.drop 方法。
以下是一個(gè)示例代碼來(lái)刪除一個(gè)名為 User 的模型:
// 刪除模型
await User.drop();注意,刪除模型將會(huì)永久刪除數(shù)據(jù)庫(kù)表,包括其中的數(shù)據(jù)。在執(zhí)行模型刪除操作之前,請(qǐng)確保備份重要的數(shù)據(jù)。請(qǐng)謹(jǐn)慎操作刪除模型,確保你的操作不會(huì)導(dǎo)致數(shù)據(jù)丟失或不可逆的更改。
在異步函數(shù)中執(zhí)行刪除操作,并在完成后輸出相應(yīng)的信息。最后,記得關(guān)閉 Sequelize 連接,以避免資源泄漏。
模型查詢
先來(lái)看看查詢是一些通用查詢參數(shù)。
通用參數(shù)
where:查詢條件
使用 where 方法可以添加查詢條件,它可以用于查詢語(yǔ)句中的各種不同部分,如 findOne 和 findAll 等。通過(guò) where 方法可以根據(jù)指定的條件過(guò)濾數(shù)據(jù)庫(kù)中的記錄。
Op 對(duì)象是 Sequelize 中用于定義各種操作符的對(duì)象。它提供了很多常用的操作符,可以在查詢條件中使用。以下是一些常見的 Op 屬性及其對(duì)應(yīng)的操作符:
- Op.eq:等于
- Op.ne:不等于
- Op.gt:大于
- Op.gte:大于等于
- Op.lt:小于
- Op.lte:小于等于
- Op.like:模糊匹配
- Op.notLike:不匹配
- Op.iLike:忽略大小寫的模糊匹配
- Op.notILike:忽略大小寫的不匹配
- Op.in:在給定數(shù)組中的值
- Op.notIn:不在給定數(shù)組中的值
- Op.between:在給定范圍內(nèi)的值
- Op.notBetween:不在給定范圍內(nèi)的值
等于
model.findAll({
where: {
age: 18
}
});上述代碼會(huì)查找 age 等于 18 的所有記錄。
不等于
model.findAll({
where: {
age: {[Op.ne]: 18}
}
});上述代碼會(huì)查找 age 不等于 18 的所有記錄。
大于
model.findAll({
where: {
age: {[Op.gt]: 18}
}
});上述代碼會(huì)查找 age 大于 18 的所有記錄。
小于
model.findAll({
where: {
age: {[Op.lt]: 18}
}
});上述代碼會(huì)查找 age 小于 18 的所有記錄。
大于等于
model.findAll({
where: {
age: {[Op.gte]: 18}
}
});上述代碼會(huì)查找 age 大于等于 18 的所有記錄。
小于等于
model.findAll({
where: {
age: {[Op.lte]: 18}
}
});上述代碼會(huì)查找 age 小于等于 18 的所有記錄。
模糊匹配
model.findAll({
where: {
name: {
[Op.like]: '%John%'
}
}
});上述代碼會(huì)查找 name 字段中包含 "John" 的所有記錄。
也可以使用 $like 來(lái)查詢,這是 sequelize 的舊語(yǔ)法,建議使用新語(yǔ)法 [Op.like] 來(lái)查詢:
model.findAll({
where: {
name: {
$like: '%John%'
}
}
});范圍
model.findAll({
where: {
age: {[Op.between]: [18, 30]}
}
});上述代碼會(huì)查找 age 在 18 到 30 之間的所有記錄。
子查詢
可以使用 [Op.or] 操作符來(lái)實(shí)現(xiàn)查詢一個(gè)字段等于 a 或 b 的操作。
const { Op } = require('sequelize');
const users = await User.findAll({
where: {
[Op.or]: [
{ name: 'a' },
{ name: 'b' },
],
},
});這里使用 findAll 方法查找所有名字等于 'a' 或 'b' 的用戶。其中,[Op.or] 表示 OR 連接操作符,將兩個(gè)條件拼接成 OR 條件。
注意,在實(shí)際使用時(shí),如果需要查詢多個(gè)可能值,可以使用[Op.in]操作符,例如:
const users = await User.findAll({
where: {
name: {
[Op.in]: ['a', 'b'],
},
},
});上述代碼將會(huì)查詢所有名字等于 'a' 或 'b' 的用戶。
include:包含關(guān)聯(lián)模型
在 Sequelize 中,可以使用關(guān)聯(lián)來(lái)定義模型之間的關(guān)系,例如一對(duì)一、一對(duì)多或多對(duì)多關(guān)系。當(dāng)查詢模型時(shí),如果希望返回與該模型關(guān)聯(lián)的其他模型的屬性,就需要使用 include 選項(xiàng)來(lái)包含關(guān)聯(lián)模型??梢愿鶕?jù)需要輕松地從其他模型中獲取相關(guān)數(shù)據(jù),而無(wú)需單獨(dú)進(jìn)行額外的查詢操作。
User.findAll({
include: {
model: Post,
attributes: ['title', 'content']
}
})
.then((users) => {
// 處理查詢結(jié)果
users.forEach((user) => {
console.log('用戶名:', user.name);
console.log('用戶發(fā)布的文章:');
user.Posts.forEach((post) => {
console.log('標(biāo)題:', post.title);
console.log('內(nèi)容:', post.content);
});
});
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});這里使用 User 模型進(jìn)行查詢,通過(guò) include 選項(xiàng)包含了關(guān)聯(lián)的 Post 模型。然后,在 .then 回調(diào)函數(shù)中處理查詢結(jié)果。每個(gè)用戶對(duì)象都包含了他們的相關(guān)文章數(shù)據(jù),可以通過(guò)訪問(wèn) user.Posts 屬性來(lái)獲取關(guān)聯(lián)的文章數(shù)據(jù)。
當(dāng)在主模型上執(zhí)行查詢后,包含關(guān)聯(lián)模型的查詢實(shí)際上是在主模型查詢的基礎(chǔ)上進(jìn)行的。
首先,使用主模型進(jìn)行查詢,獲取與查詢條件匹配的主模型數(shù)據(jù)。然后,在查詢結(jié)果中包含的每個(gè)主模型實(shí)例上,Sequelize 將自動(dòng)執(zhí)行額外的查詢來(lái)獲取與之關(guān)聯(lián)的其他模型的數(shù)據(jù)。
這種查詢方式稱為延遲加載或延遲關(guān)聯(lián)。它的優(yōu)點(diǎn)是只有在需要訪問(wèn)關(guān)聯(lián)模型數(shù)據(jù)時(shí)才執(zhí)行額外的查詢,避免了不必要的查詢開銷。
在上面的示例中,當(dāng)調(diào)用 User.findAll() 查詢用戶時(shí),Sequelize 會(huì)從數(shù)據(jù)庫(kù)獲取與查詢條件匹配的用戶數(shù)據(jù)。然后,當(dāng)訪問(wèn) user.Posts 屬性時(shí),Sequelize 會(huì)自動(dòng)執(zhí)行另一個(gè)查詢來(lái)獲取該用戶關(guān)聯(lián)的文章數(shù)據(jù)。
在查詢時(shí)包含多個(gè)關(guān)聯(lián)模型,可以通過(guò) Sequelize 的 include 選項(xiàng)的不同方式來(lái)實(shí)現(xiàn)。下面有兩種常用的方法:
- 使用數(shù)組形式包含多個(gè)關(guān)聯(lián)模型:
User.findAll({
include: [
{ model: Profile },
{ model: Post }
]
})
.then((users) => {
// 處理查詢結(jié)果
users.forEach((user) => {
console.log('用戶名:', user.name);
console.log('用戶配置:', user.Profile);
console.log('用戶文章:', user.Posts);
});
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});在上述代碼中,將要包含的關(guān)聯(lián)模型作為對(duì)象放入數(shù)組中,并將該數(shù)組作為 include 選項(xiàng)的值。這樣,在查詢結(jié)果中就會(huì)包含多個(gè)關(guān)聯(lián)模型的數(shù)據(jù)。
- 嵌套方式包含多個(gè)關(guān)聯(lián)模型:
User.findAll({
include: [
{
model: Profile,
include: [Category] // 在 Profile 模型中嵌套包含 Category 模型
},
{ model: Post }
]
})
.then((users) => {
// 處理查詢結(jié)果
users.forEach((user) => {
console.log('用戶名:', user.name);
console.log('用戶配置:', user.Profile);
console.log('用戶文章:', user.Posts);
console.log('用戶配置的類別:', user.Profile.Category);
});
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});這里使用嵌套的方式,在其中一個(gè)關(guān)聯(lián)模型的 include 選項(xiàng)中,再嵌套包含另一個(gè)關(guān)聯(lián)模型。這樣可以實(shí)現(xiàn)更深層次的關(guān)聯(lián)查詢。
通過(guò)以上方式,可以在查詢時(shí)包含多個(gè)關(guān)聯(lián)模型,并獲取它們的數(shù)據(jù)。根據(jù)需求和模型之間的關(guān)系,可以靈活地組合和嵌套使用 include 選項(xiàng)來(lái)包含多個(gè)關(guān)聯(lián)模型。
注意:只有在模型定義中定義了關(guān)聯(lián)關(guān)系,才能在查詢時(shí)包含關(guān)聯(lián)模型。
attributes:返回字段
可以使用 attributes 選項(xiàng)指定要返回的字段。示例:attributes: ['id', 'name']。它用于控制查詢結(jié)果中包含哪些屬性或排除哪些屬性,可以接受多種形式的參數(shù),以控制返回的屬性。
以下是幾種常見的 attributes 選項(xiàng)的用法:
- 字符串?dāng)?shù)組:可以傳入一個(gè)字符串?dāng)?shù)組,表示要返回的屬性名。示例:attributes: ['name', 'age'],表示查詢結(jié)果將僅包含 'name' 和 'age' 兩個(gè)字段。
- 嵌套對(duì)象:可以傳入一個(gè)嵌套對(duì)象,用于更復(fù)雜的字段控制。示例:attributes: { include: ['name'], exclude: ['age'] },表示查詢結(jié)果將包含 name 字段,并排除 age 字段。
- 聚合函數(shù):可以使用聚合函數(shù)對(duì)屬性進(jìn)行計(jì)算,并將計(jì)算結(jié)果命名為新的屬性。示例:attributes: [[sequelize.fn('SUM', sequelize.col('quantity')), 'totalQuantity']],表示查詢結(jié)果中將返回一個(gè)計(jì)算總和的聚合函數(shù),并將計(jì)算結(jié)果命名為totalQuantity。
注意事項(xiàng):
- 如果不指定 attributes 選項(xiàng),默認(rèn)情況下會(huì)返回所有模型的屬性;指定了 attributes 選項(xiàng)后,只會(huì)返回指定的屬性。
- 使用 attributes 選項(xiàng)時(shí),如果要返回關(guān)聯(lián)模型的屬性,需要在關(guān)聯(lián)模型上設(shè)置 include 選項(xiàng)。
order:排序規(guī)則
可以使用 order 選項(xiàng)來(lái)指定返回結(jié)果的排序規(guī)則。示例:order: [['createdAt', 'DESC']],它表示按照 createdAt 字段進(jìn)行降序排列。
在 Sequelize 中,可以通過(guò) order 選項(xiàng)來(lái)指定查詢結(jié)果的排序規(guī)則。排序規(guī)則由一個(gè)二維數(shù)組表示,每個(gè)子數(shù)組包含兩個(gè)元素:排序字段和排序方式。排序字段可以是模型的屬性名或關(guān)聯(lián)模型的屬性名。排序方式可以是 'ASC'(升序)或 'DESC'(降序)。
以下是order 選項(xiàng)常見的用法:
- 單字段排序:可以只指定一個(gè)排序字段和排序方式。示例:order: [['fieldName', 'ASC']]。
- 多字段排序:可以指定多個(gè)排序字段和排序方式,按照指定的順序依次排序。示例:order: [['field1', 'ASC'], ['field2', 'DESC']]。
- 關(guān)聯(lián)模型排序:可以使用關(guān)聯(lián)模型的屬性進(jìn)行排序。示例:order: [['RelatedModel', 'fieldName', 'ASC']]。
注意事項(xiàng):
- 排序字段必須是模型或關(guān)聯(lián)模型的屬性名。
- 排序方式應(yīng)為 'ASC' 或 'DESC'。
- 在查詢語(yǔ)句中使用多個(gè)排序條件時(shí),將按照指定的順序依次應(yīng)用這些條件。
Model.findOne({
where: {
// 查詢條件
status: 'active'
},
order: [['createdAt', 'DESC']]
})
.then((records) => {
// 處理查詢結(jié)果
})
.catch((error) => {
// 處理查詢錯(cuò)誤
})這里使用了 order 選項(xiàng),通過(guò) [['createdAt', 'DESC']] 指定了按照 createdAt 字段進(jìn)行降序排列。
limit:查詢結(jié)果的數(shù)量
用于限制查詢結(jié)果返回的記錄數(shù)量,常用于分頁(yè)查詢。
Model.findAll({
limit: 10 // 返回最多 10 條記錄
})
.then((results) => {
// 處理查詢結(jié)果
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});offset:查詢結(jié)果的偏移量
用于設(shè)置查詢結(jié)果的偏移量,從指定位置開始返回結(jié)果,常用于分頁(yè)查詢。這個(gè)偏移量是基于索引的,而索引是從零開始計(jì)數(shù)的。
Model.findAll({
offset: 5 // 忽略前 5 條記錄
})
.then((results) => {
// 處理查詢結(jié)果
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});group:結(jié)果分組
用于對(duì)結(jié)果進(jìn)行分組:按照指定的字段值進(jìn)行分類歸納,將具有相同字段值的記錄放在一組中。
Model.findAll({
attributes: ['age'],
group: ['age']
})
.then((results) => {
// 處理查詢結(jié)果
results.forEach((group) => {
console.log('分組:');
group.forEach((record) => {
console.log('記錄:', record);
});
});
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});這里使用 group 選項(xiàng)對(duì) age 字段進(jìn)行分組。查詢結(jié)果 results 是一個(gè)數(shù)組,其中每個(gè)元素代表一個(gè)分組。對(duì)于每個(gè)分組,可以遍歷內(nèi)層數(shù)組 group,其中的每個(gè)元素代表該分組中的一條記錄。
distinct:結(jié)果去重
當(dāng)設(shè)置 distinct: true 時(shí),查詢結(jié)果將會(huì)返回去重后的記錄。這在某些情況下非常有用,例如獲取一個(gè)字段的唯一值列表或者按照某個(gè)字段進(jìn)行分組統(tǒng)計(jì)時(shí)。
這里使用 distinct: true 設(shè)置查詢結(jié)果為去重模式,并指定了要查詢的字段為 name。查詢結(jié)果將只包含去重后的姓名列表。
例如,假設(shè)有一個(gè)名為 User 的模型,并且希望獲取所有不重復(fù)的用戶名:
const users = await User.findAll({
attributes: ['name'],
distinct: true
});這里通過(guò)設(shè)置 distinct: true 來(lái)確保只返回不重復(fù)的用戶名。查詢結(jié)果將只包含唯一的、不重復(fù)的用戶名。
注意,distinct 選項(xiàng)必須與指定的查詢字段一起使用,確保只對(duì)指定的字段進(jìn)行去重操作。
findOne:查詢第一條
查詢符合條件的第一條記錄。
Model.findOne({
where: {
// 查詢條件
id: 1
}
})
.then((record) => {
if (record) {
console.log('查詢到的記錄:', record.get({ plain: true }));
} else {
console.log('未找到符合條件的記錄');
}
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});這個(gè)方法的返回值是一個(gè) Sequelize Model 對(duì)象,其中包含與記錄相關(guān)聯(lián)的屬性、方法和關(guān)系。它具有以下特性:
- 屬性訪問(wèn):可以通過(guò)屬性名直接訪問(wèn)記錄的字段值,例如 record.fieldName。
- 數(shù)據(jù)獲?。嚎梢允褂?nbsp;.get() 方法獲取包含所有字段的對(duì)象形式的記錄數(shù)據(jù),例如 record.get(),其用法如下。
record.get():返回一個(gè)包含所有字段的對(duì)象,其中字段名作為鍵,字段值作為值。這個(gè)對(duì)象是 Sequelize 模型實(shí)例,包含與記錄相關(guān)聯(lián)的屬性和方法。
record.get({ plain: true }):返回一個(gè)純對(duì)象,只包含記錄的原始字段和值,不包含與 Sequelize 相關(guān)的屬性和方法。
獲取指定字段的值:可以傳遞一個(gè)或多個(gè)字段名作為參數(shù),獲取特定字段的值。示例:record.get('fieldName') 或 record.get('field1', 'field2')。
排除指定字段:可以使用 { exclude: ['fieldName'] } 選項(xiàng)來(lái)排除指定的字段,獲取除這些字段外的其他字段。示例:record.get({ exclude: ['fieldName'] })。
只獲取指定字段:可以使用 { attributes: ['fieldName'] } 選項(xiàng)來(lái)只獲取指定的字段。示例:record.get({ attributes: ['fieldName'] })。
Model.findOne({
where: {
// 查詢條件
id: 1
}
})
.then((record) => {
if (record) {
const fieldValue = record.get('fieldName');
console.log('字段值:', fieldValue);
const excludedData = record.get({ exclude: ['field1', 'field2'] });
console.log('排除字段后的數(shù)據(jù):', excludedData);
const selectedData = record.get({ attributes: ['field1', 'field2'] });
console.log('只包含指定字段的數(shù)據(jù):', selectedData);
} else {
console.log('未找到符合條件的記錄');
}
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});注意,Model.findOne 方法只返回滿足查詢條件的第一條記錄。如果沒(méi)有符合條件的記錄,則返回 null。
另外,distinct: true 在某些數(shù)據(jù)庫(kù)管理系統(tǒng)中可能會(huì)導(dǎo)致性能下降,因?yàn)樗枰M(jìn)行更多的計(jì)算來(lái)實(shí)現(xiàn)去重。所以在使用 distinct: true 時(shí),要謹(jǐn)慎考慮其對(duì)性能的影響。
findAll:查詢?nèi)?/h3>
sequelize.findAll() 用于從數(shù)據(jù)庫(kù)中檢索所有匹配給定條件的記錄。它的語(yǔ)法如下:
Model.findAll({
attributes: [], // 要選擇的屬性列表,默認(rèn)為所有屬性
where: {}, // 過(guò)濾條件
include: [], // 關(guān)聯(lián)模型
order: [], // 排序規(guī)則
limit: 0, // 返回的最大記錄數(shù),默認(rèn)為0(返回所有記錄)
offset: 0, // 結(jié)果集的起始偏移量,默認(rèn)為0
});參數(shù)說(shuō)明:
- attributes:指定要選擇的屬性列表,如果為空,則返回所有屬性。
- where:指定過(guò)濾條件,可以使用各種條件運(yùn)算符(如等于、不等于、大于、小于等)來(lái)篩選記錄。
- include:指定要關(guān)聯(lián)的其他模型,可以進(jìn)行關(guān)聯(lián)查詢。
- order:指定結(jié)果集的排序規(guī)則。
- limit:指定要返回的最大記錄數(shù),默認(rèn)為0,表示返回所有符合條件的記錄。
- offset:指定結(jié)果集的起始偏移量,默認(rèn)為0。
這個(gè)方法將返回一個(gè)Promise,當(dāng)查詢成功時(shí),Promise將解析為包含所有符合條件的記錄的數(shù)組。以下是一個(gè)示例:
Model.findAll({
where: {
// 查詢條件
status: 'active'
}
})
.then((records) => {
if (records.length > 0) {
console.log('查詢到的記錄數(shù):', records.length);
records.forEach((record) => {
const data = record.get();
console.log('記錄數(shù)據(jù):', data);
});
} else {
console.log('未找到符合條件的記錄');
}
})
.catch((error) => {
// 處理查詢錯(cuò)誤
});注意,如果沒(méi)有查詢到符合條件的記錄,返回的數(shù)組將為空。
findByPk:根據(jù)主鍵值查詢
根據(jù)主鍵值查詢記錄,它的語(yǔ)法如下:
Model.findByPk(id, options);參數(shù)說(shuō)明:
- id:要查詢的記錄的主鍵值。
- options:可選參數(shù),用于指定進(jìn)一步的配置,比如關(guān)聯(lián)模型等。
下面來(lái)看一個(gè)例子,通過(guò)主鍵值來(lái)獲取特定的用戶記錄:
const user = await User.findByPk(1);
console.log(user);上述代碼將查詢主鍵值為 1 的用戶記錄,并將結(jié)果保存在 user 變量中。如果找到匹配的記錄,則 user 將是一個(gè)包含該記錄的對(duì)象。否則,user 將是 null。
如果要通過(guò)主鍵值獲取多個(gè)記錄,可以傳入一個(gè)數(shù)組作為 id 參數(shù),如:
const users = await User.findByPk([1, 2, 3]);
console.log(users);上述代碼將查詢主鍵值為 1、2 和 3 的用戶記錄,并將結(jié)果保存在 users 變量中,它將是一個(gè)包含這些記錄的數(shù)組。
findByPk 也可以與其他查詢配置選項(xiàng)一起使用,例如關(guān)聯(lián)模型、選擇屬性等??梢栽?nbsp;options 參數(shù)中指定這些額外的配置選項(xiàng)。
注意:findByPk 方法返回一個(gè) Promise,在查詢成功時(shí)解析為匹配的記錄(或記錄數(shù)組),在查詢失敗時(shí)拒絕為錯(cuò)誤對(duì)象。因此,需要使用 await 或 .then() 來(lái)處理查詢結(jié)果或捕獲錯(cuò)誤。
在 Sequelize 中,主鍵值是指用于唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中每個(gè)記錄的列或?qū)傩?。主鍵值在表中具有唯一性,沒(méi)有重復(fù)的值,且不能為空。在 Sequelize 模型定義中,可以通過(guò) primaryKey: true 來(lái)將某個(gè)屬性指定為主鍵。例如:
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: DataTypes.STRING,
email: DataTypes.STRING
});在上述例子中,id 屬性被指定為主鍵。它的類型為整數(shù)(INTEGER),并且設(shè)置了 primaryKey: true 表示該屬性是主鍵。此外,還可以使用 autoIncrement: true 來(lái)指定該主鍵自動(dòng)增長(zhǎng),以便在插入新記錄時(shí)自動(dòng)生成唯一的主鍵值。
當(dāng)使用 findByPk、update、destroy 等方法時(shí),通常會(huì)使用主鍵值來(lái)準(zhǔn)確定位要操作的記錄。通過(guò)提供正確的主鍵值,Sequelize 可以根據(jù)主鍵來(lái)查詢、更新或刪除相應(yīng)的記錄。
findOrCreate:查詢或創(chuàng)建
findOrCreate 用于根據(jù)指定條件查找數(shù)據(jù)庫(kù)中的記錄,如果找到匹配的記錄,則返回該記錄;如果找不到匹配的記錄,則創(chuàng)建一個(gè)新的記錄并返回。它的語(yǔ)法如下:
Model.findOrCreate({
where: { ... },
defaults: { ... },
...
});參數(shù)說(shuō)明:
- where:包含查找條件的對(duì)象,用于指定要匹配的屬性和值。
- defaults:包含要?jiǎng)?chuàng)建新記錄時(shí)的默認(rèn)值的對(duì)象。
- ...:其他可選參數(shù),用于進(jìn)一步配置查詢。
使用 findOrCreate 方法時(shí),Sequelize 首先根據(jù) where 條件嘗試在數(shù)據(jù)庫(kù)中查找符合條件的記錄。如果找到匹配的記錄,則返回該記錄作為結(jié)果。
如果沒(méi)有找到匹配的記錄,則使用 defaults 指定的默認(rèn)值創(chuàng)建一個(gè)新的記錄,并返回該新記錄作為結(jié)果。默認(rèn)值將應(yīng)用于新創(chuàng)建的記錄的屬性。
例如,假設(shè)有一個(gè)名為 User 的模型表示用戶表,其中 email 是唯一的:
const User = sequelize.define('User', {
name: DataTypes.STRING,
email: {
type: DataTypes.STRING,
unique: true
}
});現(xiàn)在想根據(jù)郵箱查找用戶記錄,如果找到則返回該記錄,如果找不到則創(chuàng)建一個(gè)新用戶記錄??梢允褂?nbsp;findOrCreate 方法:
const [user, created] = await User.findOrCreate({
where: { email: '[email protected]' },
defaults: { name: 'John Doe' }
});
console.log(user); // 匹配的記錄或新創(chuàng)建的記錄
console.log(created); // 表示是否新創(chuàng)建了記錄的布爾值上述代碼將根據(jù)指定的郵箱查找用戶記錄,如果找到匹配的記錄,則返回該記錄。如果沒(méi)有找到匹配的記錄,則創(chuàng)建一個(gè)新的記錄,并返回新創(chuàng)建的記錄。
findOrCreate 方法返回一個(gè)包含兩個(gè)元素的數(shù)組:第一個(gè)元素是匹配的記錄(已存在或新創(chuàng)建),第二個(gè)元素是一個(gè)布爾值,表示是否新創(chuàng)建了記錄。
如果有多個(gè)符合條件的記錄,findOrCreate 方法僅返回匹配的第一個(gè)記錄。它不會(huì)返回所有符合條件的記錄。
findAndCountAll:查詢記錄和數(shù)量
findAndCountAll 用于查找滿足指定條件的所有記錄,并返回滿足條件的記錄數(shù)組和記錄總數(shù)。它的語(yǔ)法如下:
Model.findAndCountAll({
where: { ... },
include: [ ... ],
offset: ...,
limit: ...,
order: [...],
...
});參數(shù)說(shuō)明:
- where:包含查找條件的對(duì)象,用于指定要匹配的屬性和值。
- include:指定關(guān)聯(lián)模型,用于在查詢中包含關(guān)聯(lián)的數(shù)據(jù)。
- offset:指定查詢的偏移量,用于分頁(yè)。
- limit:指定查詢的限制數(shù)量,用于分頁(yè)。
- order:指定查詢結(jié)果的排序順序。
- ...:其他可選參數(shù),用于進(jìn)一步配置查詢。
使用 findAndCountAll 方法時(shí),Sequelize 將根據(jù)指定的條件在數(shù)據(jù)庫(kù)中查找符合條件的所有記錄,并同時(shí)返回滿足條件的記錄數(shù)組和記錄總數(shù)。
const { count, rows } = await User.findAndCountAll({
where: { age: 25 },
include: [Post],
offset: 0,
limit: 10,
order: [['createdAt', 'DESC']]
});
console.log(count); // 符合條件的記錄總數(shù)
console.log(rows); // 符合條件的記錄數(shù)組在上述代碼中,findAndCountAll 方法將根據(jù)年齡為 25 的條件在數(shù)據(jù)庫(kù)中查找用戶記錄,并返回滿足條件的記錄總數(shù)和記錄數(shù)組。include 參數(shù)用于指定要關(guān)聯(lián)的 Post 模型。
findAndCountAll 方法返回的結(jié)果是一個(gè)包含 count 和 rows 屬性的對(duì)象。count 表示符合條件的記錄總數(shù),rows 表示符合條件的記錄數(shù)組。
使用 findAndCountAll 方法可以方便地獲取滿足條件的記錄總數(shù)以及相應(yīng)的記錄數(shù)組,用于實(shí)現(xiàn)分頁(yè)和其他結(jié)果統(tǒng)計(jì)的需求。
count:查詢數(shù)量
可以使用 count 方法來(lái)獲取滿足指定條件的記錄數(shù)。它的語(yǔ)法如下:
Model.count({
where: { ... },
...
});參數(shù)說(shuō)明:
- where:包含查找條件的對(duì)象,用于指定要匹配的屬性和值。
- ...:其他可選參數(shù),用于進(jìn)一步配置查詢。
使用 count 方法時(shí),Sequelize 將根據(jù)指定的條件在數(shù)據(jù)庫(kù)中計(jì)算符合條件的記錄數(shù),并返回該記錄數(shù)。
const count = await User.count({
where: { age: 25 }
});
console.log(count); // 符合條件的記錄數(shù)在上述代碼中,count 方法將根據(jù)年齡為 25 的條件在數(shù)據(jù)庫(kù)中計(jì)算符合條件的用戶記錄數(shù),并將其返回。該方法返回的結(jié)果將是一個(gè)表示符合條件的記錄數(shù)的整數(shù)值。
通過(guò)使用 count 方法,可以方便地獲取滿足條件的記錄數(shù),用于進(jìn)行結(jié)果統(tǒng)計(jì)、分頁(yè)計(jì)算或其他相關(guān)處理。
min, max, sum:查詢最值
可以使用 min、max 和 sum 方法來(lái)進(jìn)行最小值、最大值和求和計(jì)算。
這些方法可以通過(guò)調(diào)用模型的靜態(tài)方法來(lái)實(shí)現(xiàn),具體語(yǔ)法如下:
- min 方法用于計(jì)算指定屬性列的最小值:
Model.min('column', {
where: { ... },
...
});- max 方法用于計(jì)算指定屬性列的最大值:
Model.max('column', {
where: { ... },
...
});- sum 方法用于計(jì)算指定屬性列的總和:
Model.sum('column', {
where: { ... },
...
});參數(shù)說(shuō)明:
- 'column':要進(jìn)行計(jì)算的屬性列的名稱。
- where:包含查找條件的對(duì)象,用于指定要匹配的屬性和值。
- ...:其他可選參數(shù),用于進(jìn)一步配置查詢。
const minValue = await Model.min('column', {
where: { ... }
});
const maxValue = await Model.max('column', {
where: { ... }
});
const sumValue = await Model.sum('column', {
where: { ... }
});
console.log(minValue); // 最小值
console.log(maxValue); // 最大值
console.log(sumValue); // 總和注意,這些方法將返回一個(gè) Promise 對(duì)象,需要使用 await 或 .then() 來(lái)獲取計(jì)算結(jié)果。
create:創(chuàng)建數(shù)據(jù)
create() 方法用于在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)新的記錄。它是 Sequelize 模型的一個(gè)實(shí)例方法,可以通過(guò)模型對(duì)象調(diào)用。
const newUser = await User.create({
name: 'John Doe',
email: '[email protected]',
age: 25,
});使用 User.create() 方法創(chuàng)建一個(gè)名為 User 的新記錄。通過(guò)傳遞一個(gè)包含屬性和值的對(duì)象參數(shù),指定要?jiǎng)?chuàng)建的記錄的字段值。調(diào)用 create()方法會(huì)將新記錄插入到與模型關(guān)聯(lián)的數(shù)據(jù)庫(kù)表中,并返回一個(gè)表示新記錄的模型實(shí)例。
注意,create() 方法返回的是一個(gè) Promise 對(duì)象,因此可以使用 await 關(guān)鍵字來(lái)等待創(chuàng)建操作的結(jié)果。如果創(chuàng)建成功,將返回包含新記錄數(shù)據(jù)的模型實(shí)例;如果創(chuàng)建失敗,將拋出一個(gè)異常。
create() 方法可以用于創(chuàng)建單個(gè)記錄,也可以用于批量創(chuàng)建多條記錄。如果想要批量創(chuàng)建多條記錄,可以將一個(gè)包含多個(gè)對(duì)象的數(shù)組傳遞給 create() 方法。
const newUsers = await User.create([
{
name: 'John Doe',
email: '[email protected]',
age: 25,
},
{
name: 'Jane Smith',
email: '[email protected]',
age: 30,
},
]);bulkCreate:批量創(chuàng)建數(shù)據(jù)
要批量添加數(shù)據(jù),可以使用 Model.bulkCreate() 方法。bulkCreate() 方法接受一個(gè)數(shù)組作為參數(shù),每個(gè)數(shù)組元素都表示要?jiǎng)?chuàng)建的記錄。
const newUsers = await User.bulkCreate([
{
name: 'John Doe',
email: '[email protected]',
age: 25,
},
{
name: 'Jane Smith',
email: '[email protected]',
age: 30,
},
// 可以繼續(xù)添加更多對(duì)象...
]);這里定義了一個(gè) users 數(shù)組,其中包含要添加到數(shù)據(jù)庫(kù)的多個(gè)對(duì)象,每個(gè)對(duì)象表示一條記錄。然后,調(diào)用 User.bulkCreate() 方法,并傳遞 users 數(shù)組作為參數(shù),以批量添加這些記錄。
bulkCreate() 方法將會(huì)將數(shù)組中的每個(gè)對(duì)象插入到與模型關(guān)聯(lián)的數(shù)據(jù)庫(kù)表中,并返回一個(gè)包含新記錄的模型實(shí)例數(shù)組。可以根據(jù)實(shí)際需求在 users 數(shù)組中添加任意數(shù)量的對(duì)象,以批量添加相應(yīng)數(shù)量的記錄。
bulkCreate() 和 create() 方法都可以用于創(chuàng)建多條數(shù)據(jù),但它們之間有一些區(qū)別:
- 性能差異:
- create() 方法在循環(huán)中逐個(gè)創(chuàng)建記錄,并執(zhí)行多個(gè)數(shù)據(jù)庫(kù)查詢操作。這意味著對(duì)于大量數(shù)據(jù)的批量創(chuàng)建,性能可能較低。
- bulkCreate() 方法會(huì)將所有記錄作為一個(gè)事務(wù)一次性插入數(shù)據(jù)庫(kù),減少了數(shù)據(jù)庫(kù)查詢操作的次數(shù),因此在處理大量數(shù)據(jù)時(shí)可以更高效。
- 錯(cuò)誤處理:
- create() 方法是可回滾的,即如果在循環(huán)中創(chuàng)建多個(gè)記錄時(shí)發(fā)生錯(cuò)誤,可以選擇回滾已創(chuàng)建的記錄。
- bulkCreate() 方法默認(rèn)情況下是不可回滾的,即如果在批量插入過(guò)程中發(fā)生錯(cuò)誤,已插入的記錄將被保留。但你可以通過(guò)設(shè)置 individualHooks: true 選項(xiàng)來(lái)啟用回滾功能。
- 返回值:
- create() 方法在成功創(chuàng)建每條記錄后,返回一個(gè)表示該記錄的模型實(shí)例。
- bulkCreate() 方法在成功插入所有記錄后,返回一個(gè)包含所有新記錄的模型實(shí)例數(shù)組。
綜上所述,對(duì)于需要?jiǎng)?chuàng)建大量數(shù)據(jù)的情況,推薦使用 bulkCreate() 方法,以獲得更好的性能。但在某些情況下,例如需要在每次創(chuàng)建記錄時(shí)進(jìn)行自定義操作或錯(cuò)誤處理時(shí),可以選擇使用 create() 方法。
update:更新數(shù)據(jù)
可以使用 update 方法來(lái)更新數(shù)據(jù)庫(kù)中的記錄。它的語(yǔ)法如下:
Model.update(values, {
where: { ... },
...
});參數(shù)說(shuō)明:
- values:一個(gè)包含要更新的屬性和值的對(duì)象。
- where:一個(gè)包含更新條件的對(duì)象,用于指定要匹配的屬性和值。
- ...:其他可選參數(shù),用于進(jìn)一步配置更新。
使用 update 方法時(shí),Sequelize 將根據(jù)指定的條件在數(shù)據(jù)庫(kù)中查找符合條件的記錄,并將相應(yīng)的屬性更新為指定的新值。
const result = await User.update(
{ age: 30, status: 'active' },
{
where: { id: 1 }
}
);
console.log(result); // 更新結(jié)果在上述代碼中,update 方法將會(huì)將 id 屬性為 1 的用戶記錄的 age 和 status 屬性更新為新的值。
注意,update 方法返回一個(gè)表示更新結(jié)果的數(shù)組。該數(shù)組的第一個(gè)元素表示更新的行數(shù),第二個(gè)元素表示影響的行數(shù)。
const updatedRows = result[0];
const affectedRows = result[1];
console.log(updatedRows); // 更新的行數(shù)
console.log(affectedRows); // 影響的行數(shù)通過(guò)使用 update 方法,可以方便地更新滿足條件的記錄,并可以靈活配置要更新的屬性和值。
注意,update 方法只能更新單條記錄。如果想要更新多條數(shù)據(jù),可以借助 Promise.all 來(lái)實(shí)現(xiàn):
// 查找需要更新的數(shù)據(jù)
const usersToUpdate = await User.findAll({ where: { status: 'active' } });
// 更新數(shù)據(jù)
await Promise.all(usersToUpdate.map(user => {
return user.update(
{ status: 'inactive' } // 更新的字段和值
);
}));destroy:刪除數(shù)據(jù)
在 Sequelize 中,可以使用 destroy 方法來(lái)刪除數(shù)據(jù)庫(kù)中的記錄。它的語(yǔ)法如下:
Model.destroy({
where: { ... },
...
});參數(shù)說(shuō)明:
- where:包含刪除條件的對(duì)象,用于指定要匹配的屬性和值。
- ...:其他可選參數(shù),用于進(jìn)一步配置刪除操作。
使用 destroy 方法時(shí),Sequelize 將根據(jù)指定的條件在數(shù)據(jù)庫(kù)中查找符合條件的記錄,并將其從數(shù)據(jù)庫(kù)中刪除。<
網(wǎng)頁(yè)題目:學(xué)會(huì)Sequelize,讓你操作數(shù)據(jù)更絲滑!
本文地址:http://fisionsoft.com.cn/article/cdjpjjo.html


咨詢
建站咨詢
