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