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

    sequelize.sync();
})();

image-20220123143545971

注意点

// 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();
})();

image-20220123150231363

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

image-20220123150458713

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

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

image-20220123190438600

再次运行创建模型的同步方法,数据库当中的结果如下:

image-20220123190524964

posted @ 2022-01-23 19:06  BNTang  阅读(195)  评论(0编辑  收藏  举报