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-hant/n/134625.html