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

发布于:2025-07-18 ⋅ 阅读:(16) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到