Sequelize是Node.js使用的最廣泛的ORM框架之一。它支持多種流行的資料庫,如MySQL,PostgreSQL,SQLite和Microsoft SQL Server。Sequelize使得在Node.js應用程序中使用資料庫成為一項簡單和快捷的工作,而不需要寫大量的SQL查詢語句。在本文中,我們將深入研究Sequelize的一些特性,以便您可以更好地創建和使用資料庫。
一、模型定義
在Sequelize中,模型是在JavaScript對象和資料庫表之間的橋樑。一個模型只是一個JavaScript類,它描述了與表的交互方式。模型定義可以包括表名、列和其他選項,如主鍵和外鍵。以下是一個基本模型的代碼示例:
const { Model, DataTypes } = require('sequelize');
const sequelize = require('../config/database');
class User extends Model {}
User.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
firstName: {
type: DataTypes.STRING,
allowNull: false
},
lastName: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
password: {
type: DataTypes.STRING,
allowNull: false
},
}, {
sequelize,
modelName: 'user'
});
module.exports = User;
在上面的示例代碼中,我們首先導入了Sequelize的Model和DataTypes。然後定義了一個User類,擴展了Sequelize提供的Model類。我們使用User.init定義了模型,設置了各個屬性的類型和限制。 最後,我們將模型導出以供在應用程序中使用。
二、數據遷移
Sequelize提供了一種稱為「數據遷移」的機制,可以輕鬆地升級和回滾資料庫模式。 Sequelize將在一個稱為「遷移文件」的JavaScript文件中描述更改。其中包含了需要添加、刪除和修改的列以及表。
以下是一個添加新表的示例代碼:
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('tasks', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
title: {
type: Sequelize.STRING,
allowNull: false
},
description: {
type: Sequelize.STRING,
allowNull: false
},
completed: {
type: Sequelize.BOOLEAN,
defaultValue: false
},
createdAt: {
type: Sequelize.DATE,
allowNull: false
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false
},
userId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: 'users',
key: 'id'
},
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('tasks');
}
};
在上面的示例代碼中,我們定義了一個稱為「tasks」的新表。它包含一個自增的id列,一個標題列,一個描述列等等。我們還創建了一個外鍵,將其鏈接到「users」表中的「id」列。下面是如何使用Sequelize CLI執行遷移的示例:
$ sequelize migration:create --name create-tasks-table $ sequelize db:migrate $ sequelize db:migrate:undo
以上命令將創建一個新的遷移文件,然後將該文件應用於資料庫。最後,我們可以通過執行反向遷移命令「sequelize.db:migrate:undo」來撤銷該遷移。
三、查詢和關聯
Sequelize提供了一個強大的查詢API,它支持大部分SQL查詢方法。例如,以下是如何在Sequelize中使用常規查詢方法的示例:
const users = await User.findAll({
where: {
firstName: 'John'
}
});
const tasks = await Task.findAll({
where: {
userId: 1,
completed: false
},
include: User
});
const task = await Task.findOne({
where: {
id: 1
},
include: User
});
const count = await Task.count({
where: {
userId: 1,
completed: false
}
});
在上面的示例代碼中,「User」和「Task」都是先前定義的模型。這些模型之間可以使用「belongsTo」、「hasOne」和「hasMany」等方法來定義關聯。例如,以下是如何在兩個模型之間創建「hasMany」關聯的代碼:
User.hasMany(Task, {
foreignKey: 'userId',
as: 'tasks'
});
Task.belongsTo(User, {
foreignKey: 'userId',
as: 'user'
});
在上面的示例代碼中,我們定義了一個「User」和「Task」之間的一對多關聯。定義中的「foreignKey」參數指定了關聯的外鍵列,「as」參數指定了關聯的別名。使用這些關聯定義,我們可以很容易地進行複雜的查詢和過濾。例如,以下是查找所有用戶及其任務的代碼:
const users = await User.findAll({
include: 'tasks'
});
四、事務
Sequelize還允許您使用事務在資料庫操作期間維護一致性。 在Sequelize中,您可以使用下面的代碼來創建和管理事務:
await sequelize.transaction(async t => {
await User.create({
firstName: 'John',
lastName: 'Doe',
email: 'john.doe@example.com',
password: 'password'
}, {
transaction: t
});
await Task.create({
title: 'First Task',
description: 'My first task',
userId: 1
}, {
transaction: t
});
await Task.create({
title: 'Second Task',
description: 'My second task',
userId: 1
}, {
transaction: t
});
});
在上面的示例代碼中,我們使用「sequelize.transaction」方法開啟一個事務,然後創建了兩條任務記錄和一個用戶記錄。 最後,事務提交後完成了所有的操作。
五、Session
在Web應用程序中,session是一種存儲特定用戶數據的機制。 Sequelize提供了一個能夠與Express會話進行集成的庫 –「connect-session-sequelize」。
以下是如何使用connect-session-sequelize庫將session保存在Sequelize資料庫中的示例代碼:
const session = require('express-session');
const SequelizeStore = require('connect-session-sequelize')(session.Store);
const sequelize = require('./config/database');
const app = express();
app.use(session({
secret: 'mysecret',
resave: false,
saveUninitialized: false,
store: new SequelizeStore({
db: sequelize,
tableName: 'sessions'
})
}));
在SequelizeApp中,我們使用「connect-session-sequelize」庫來創建一個新的SequelizeStore,然後將其作為「express-session」中用於保存session的store選項。其中「db」參數指定了Sequelize連接,tableName參數指定了將保存session數據的表名。
結論
在本文中,我們詳細介紹了Sequelize,強大的ORM框架。我們涵蓋了模型定義、數據遷移、查詢、關聯、事務和session等一些關鍵方面。由於Sequelize提供多種用於與資料庫進行交互的API,使得在Node.js應用程序中使用資料庫變得非常容易和快捷。
原創文章,作者:QDPO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134625.html
微信掃一掃
支付寶掃一掃