当前位置: 首页 > news >正文

Node.js ORM框架Sequelize 一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)

Sequelize介绍

Sequelize是一个基于 promise 的 Node.js ORM, 目前支持Postgres、MySQL、MariaDB、SQLite 以及Microsoft SQL Server,有强大的事务支持,关联关系,预读和延迟加载,读取复制等功能。地址:https://www.sequelize.cn/

node版本(v22.17.0),安装依赖:

npm install sequelize@6.37.7 --save

npm install  mysql2@3.14.2 --save

初始化Sequelize连接

sequelize.js

const { Sequelize } = require('sequelize');
// sequelize 实例
const sequelize = new Sequelize('database', 'root', '123456', {host: 'localhost',dialect: 'mysql',// 连接池pool: {max: 5, // 最大连接数量min: 0, // 最小连接数量acquire: 30000,idle: 10000   // 如果一个线程 10 秒钟内没有被使用过的话,那么就释放线程},logging: true // SQL日志
});// 测试数据库连接
(async () => {try {await sequelize.authenticate();console.log('数据库连接成功');} catch (error) {console.error('数据库连接失败', error);}
})();module.exports = sequelize;

执行测试是否连接成功:node sequelize.js

一对一(One-to-One)、一对多(One-to-Many)、多对多(Many-to-Many)

user.js

const { Sequelize } = require('sequelize');
const sequelize = require('./sequelize');// define  User  是 id,表示唯一
const User = sequelize.define('User', {id: {type: Sequelize.INTEGER, // 类型primaryKey: true, // 主键autoIncrement: true, // 是否允许自增comment: '主键'},name: {type: Sequelize.STRING(50),allowNull: false, // 是否允许为空unique: true, // 唯一comment: '用户名称'},age: {type: Sequelize.INTEGER,allowNull: false, // 是否允许为空comment: '年龄'},email: {type: Sequelize.STRING,comment: '用户邮箱'},status: {type: Sequelize.INTEGER,defaultValue: 1,comment: '用户状态'}
}, {sequelize,  // 传递连接实例tableName: 't_user', // 对应的数据库表comment: '用户表',      timestamps: false
});
module.exports = User;

user.js

const { Sequelize } = require('sequelize');
const sequelize = require('./sequelize');const Role = sequelize.define('Role', {id: {type: Sequelize.INTEGER, // 类型primaryKey: true, // 主键autoIncrement: true // 是否允许自增},roleName: {type: Sequelize.STRING(50),allowNull: false, // 是否允许为空field: "role_name"},
}, {sequelize, // 传递连接实例tableName: 't_role',// 对应的数据库表comment: '角色表',      timestamps: false
});module.exports = Role;

userRole.js,一个用户拥有多个角色,一个角色可以授权给多个用户,多对多关系。

const { Sequelize } = require('sequelize');
const sequelize = require('./sequelize');
const User = require("./user");
const Role = require("./role");const UserRole = sequelize.define('UserRole', {// id: {//     type: Sequelize.INTEGER, // 类型//     primaryKey: true, // 主键//     autoIncrement: true // 是否允许自增// },userId: {type: Sequelize.INTEGER,field: "user_id",references: {model: User,key: 'id',},},roleId: {type: Sequelize.INTEGER,field: "role_id",references: {model: Role,key: 'id',},},
}, {sequelize, // 传递连接实例tableName: 't_user_role', // 对应的数据库表comment: '用户角色表',timestamps: true
});// 用户有多个角色
User.belongsToMany(Role, {through: UserRole,          // 指定中间表foreignKey: "user_id",    // 本模型的外键otherKey: "role_id",       // 目标模型的外键
});// 角色可以授权多个用户
Role.belongsToMany(User, {through: UserRole,     // 指定中间表foreignKey: "role_id",    // 本模型的外键otherKey: "user_id",       // 目标模型的外键
});module.exports = UserRole;

order.js,一个用户拥有多个订单,一对多的关系。

const { Sequelize } = require('sequelize');
const sequelize = require('./sequelize');
const User = require("./user")const Order = sequelize.define('Order', {id: {type: Sequelize.INTEGER, // 类型primaryKey: true, // 主键autoIncrement: true // 是否允许自增},number: {type: Sequelize.STRING(50),allowNull: false, // 是否允许为空unique: true // 唯一},orderAmount: {type: Sequelize.DECIMAL,defaultValue: 0,field: "order_amount"},status: {type: Sequelize.INTEGER,defaultValue: 1}
}, {sequelize, // 传递连接实例tableName: 't_order',// 对应的数据库表comment: '订单表',timestamps: false
});// 一个用户有多个订单
User.hasMany(Order, {foreignKey: 'user_id'
});
// 订单属于用户
Order.belongsTo(User, {foreignKey: 'user_id'
});module.exports = Order;

profile.js,一个用户拥有自己的资料,一对一的关系。

const { Sequelize } = require('sequelize');
const sequelize = require('./sequelize');
const User = require("./user")const Profile = sequelize.define('Profile', {id: {type: Sequelize.INTEGER, // 类型primaryKey: true, // 主键autoIncrement: true // 是否允许自增},birthday: {type: Sequelize.DATE,allowNull: false, // 是否允许为空},work: {type: Sequelize.STRING(50),allowNull: false, // 是否允许为空},
}, {sequelize, // 连接实例tableName: 't_profile', // 对应的数据库表comment: '资料表',     timestamps: false
});// 一个用户有一个资料
User.hasOne(Profile, {foreignKey: 'user_id'
});
// 资料属于用户
Profile.belongsTo(User, {foreignKey: 'user_id'
});module.exports = Profile;

ddl.js,执行创建数据库表。

const sequelize = require('./sequelize');
const User = require("./user");
const Profile = require("./profile");
const Order = require("./order");
const UserRole = require("./userRole");async function createTables() {try {// 使用{ force: true }会删除旧表并重新创建新表(谨慎使用)await sequelize.sync({ force: true });// 使用以下方式仅创建不存在的表:// await sequelize.sync(); // 创建用户角色表// await UserRole.sync({ force: true });// 创建资料表// await Profile.sync({ force: true });// 创建订单表// await Order.sync({ force: true });console.log("User->", User === sequelize.models.User);console.log("Profile->", Profile === sequelize.models.Profile);console.log("Order->", Order === sequelize.models.Order);console.log("UserRole->", UserRole === sequelize.models.UserRole);} catch (error) {console.error('模型创建失败:', error);throw error;} finally {// 关闭数据库连接sequelize.close();}
}createTables().catch(err => console.error('Unable to sync database:', err));

http://www.dtcms.com/a/282367.html

相关文章:

  • NDVI、噪声和细微差别:使用卫星时间序列进行土地覆盖分类
  • K近邻算法的分类与回归应用场景
  • LVS集群调度器
  • 2022年CIE SCI2区TOP,NSGA-II+直升机-无人机搜救任务分配,深度解析+性能实测
  • MongoDB查询的精准匹配和$in的查询区别
  • fastadmin会员单点登录
  • Python进程与协程:高效编程的核心秘密
  • Apache SeaTunnel详解与部署(最新版本2.3.11)
  • 拉普拉斯方程边界问题求解
  • 跟着Nature正刊学作图:回归曲线+散点图
  • 912. 排序数组
  • orfeotoolbox Pansharpening-全色锐化
  • TDengine 中 InterP 函数用户手册
  • 医疗AI“全栈原生态“系统设计路径分析
  • 多人协作游戏中,团队共同获取的装备如何确定按份共有或共同共有
  • 二代身份证识别技术的发展:从机器学习到深度学习
  • 【机器学习】数据理解:数据导入、数据审查与数据可视化
  • Qt小组件 - 7 SQL Thread Qt访问数据库ORM
  • gin go-kratos go-zero框架对比
  • 【后端】配置SqlSugar ORM框架并添加仓储
  • 【论文阅读 | IF 2025 | COMO:用于多模态目标检测的跨 Mamba 交互与偏移引导融合】
  • Web3.0与元宇宙:重构数字文明的技术范式与社会变革
  • 以太网供电与自愈网络对音视频系统的益处
  • 基于 elements3 包装的 可展开 table 组件
  • Elasticsearch+Logstash+Filebeat+Kibana部署
  • 前端状态管理对比:Redux与Vuex的深度分析
  • 利用 Spring 的 `@Scheduled` 注解结合简单的状态跟踪实现空闲检测方案
  • Node.js Domain 模块深度解析与最佳实践
  • 玩转Docker | 使用Docker部署vnStat网络流量监控服务
  • WPF 导入自定义字体并实现按钮悬停高亮效果