Sequelize-建立表关系

作者: adm 分类: node 发布时间: 2023-02-23

本文主要介绍的内容为,建立表之间的关系,和标题的内容相关,在我们之前建立关系的时候是在模型创建完毕之后才进行关系的建立的,如果在没有建立关系的情况下创建模型是不会自动添加外键的:

// 1.导入Sequelize
const Sequelize = require('sequelize');

(async () => {
    // 2.配置连接信息
    const sequelize = new Sequelize('demo', 'root', 'yangbuyiya', {
        // MySQL服务器地址
        host: 'www.yangbuyi.top',
        // MySQL服务器端口号
        port: 3310,
        // 注意点: Sequelize不仅仅能操作MySQL还能够操作其它类型的数据库
        // 告诉Sequelize当前要操作的数据库类型
        dialect: 'mysql',
        // 连接池
        pool: {
            // 最多有多少个连接
            max: 5,
            // 最少有多少个连接
            min: 0,
            // 当前连接多久没有操作就断开
            idle: 10000,
            // 多久没有获取到连接就断开
            acquire: 30000,
        }
    });

    // 3.创建模型
    const User = sequelize.define('user', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        age: {
            type: Sequelize.TINYINT,
            defaultValue: 66
        },
        gender: {
            type: Sequelize.ENUM(['男', '女', '妖']),
            defaultValue: '妖'
        }
    }, {
        // 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,

        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false
    });

    const Book = sequelize.define('book', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        price: {
            type: Sequelize.DOUBLE,
            defaultValue: 66
        },
        uId: {
            type: Sequelize.INTEGER,
            allowNull: false
        }
    }, {
        // 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,

        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false
    });

    sequelize.sync();
})();

注意点

// 4.建立查询关系
// 一个人拥有多本书
User.hasMany(Book, {
    foreignKey: 'uId',
    sourceKey: 'id'
});

// 一本书属于一个人
Book.belongsTo(User, {
    foreignKey: 'uId',
    sourceKey: 'id'
});
想要 sequelize 自动创建外键, 那么就必须在写完上述的两句代码之后再执行同步方法, 才会自动创建对应的外键:

// 1.导入Sequelize
const Sequelize = require('sequelize');

(async () => {
    // 2.配置连接信息
    const sequelize = new Sequelize('demo', 'root', 'yangbuyiya', {
        // MySQL服务器地址
        host: 'www.yangbuyi.top',
        // MySQL服务器端口号
        port: 3310,
        // 注意点: Sequelize不仅仅能操作MySQL还能够操作其它类型的数据库
        // 告诉Sequelize当前要操作的数据库类型
        dialect: 'mysql',
        // 连接池
        pool: {
            // 最多有多少个连接
            max: 5,
            // 最少有多少个连接
            min: 0,
            // 当前连接多久没有操作就断开
            idle: 10000,
            // 多久没有获取到连接就断开
            acquire: 30000,
        }
    });

    // 3.创建模型
    const User = sequelize.define('user', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        age: {
            type: Sequelize.TINYINT,
            defaultValue: 66
        },
        gender: {
            type: Sequelize.ENUM(['男', '女', '妖']),
            defaultValue: '妖'
        }
    }, {
        // 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,

        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false
    });

    const Book = sequelize.define('book', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true
        },
        name: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        price: {
            type: Sequelize.DOUBLE,
            defaultValue: 66
        },
        uId: {
            type: Sequelize.INTEGER,
            allowNull: false
        }
    }, {
        // 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,

        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false
    });

    // 4.建立查询关系
    // 一个人拥有多本书
    User.hasMany(Book, {
        foreignKey: 'uId',
        sourceKey: 'id'
    });

    // 一本书属于一个人
    Book.belongsTo(User, {
        foreignKey: 'uId',
        sourceKey: 'id'
    });

    sequelize.sync();
})();

通过观察发现相关的外键已经帮我们创建完成了,其实除了如上的方式进行创建外键还有另外一种方式,来建立表与表之间的关系,首先将 hasMany、belongsTo 当中指定的对应关系进行删除:

然后在修改 Book 模型的 User 关系 id 字段:

userId: {
    type: Sequelize.INTEGER,
    allowNull: false,
    references: {
        model: User,
        key: 'id'
    }
}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!