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));