Sequelize-创建数据

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

因为之前已经创建好了对应的表了,所以创建模型那块的代码就不需要再次调用 sequelize.sync(); 了,要想添加一条对应的数据其实对应的在 sequelize 当中就是一个模型,创建一个模型就相当于添加了一行数据了:

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

// 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: {
        // varchar(255)
        type: Sequelize.STRING,
        allowNull: false,
        unique: true
    },
    age: {
        type: Sequelize.TINYINT,
        defaultValue: 66
    },
    gender: {
        type: Sequelize.ENUM(['男', '女', '妖']),
        defaultValue: '妖'
    }
}, {// 告诉 sequelize 不需要自动将表名变成复数
    freezeTableName: true,
    // 自定义表名
    // tableName: 'student',
    // 不需要自动创建 createAt / updateAt 这两个字段
    timestamps: false,
    // 指定索引
    indexes: [
        {
            // 索引名称
            name: 'idx_age',
            // 索引字段名称
            fields: ['age'],
        }
    ]
});

// 4.创建一条数据(一条记录)
let u = new User();
u.name = 'zs';
u.age = 33;
u.gender = '男';

代码如上,运行代码发现控制台啥也没输出这又是为啥呢,其实这里有一个注意点,创建好一条数据之后,默认情况下不会立即同步到表中,如果想立即同步到表中,那么必须调用对象的 save 方法:

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

// 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: {
        // varchar(255)
        type: Sequelize.STRING,
        allowNull: false,
        unique: true
    },
    age: {
        type: Sequelize.TINYINT,
        defaultValue: 66
    },
    gender: {
        type: Sequelize.ENUM(['男', '女', '妖']),
        defaultValue: '妖'
    }
}, {// 告诉 sequelize 不需要自动将表名变成复数
    freezeTableName: true,
    // 自定义表名
    // tableName: 'student',
    // 不需要自动创建 createAt / updateAt 这两个字段
    timestamps: false,
    // 指定索引
    indexes: [
        {
            // 索引名称
            name: 'idx_age',
            // 索引字段名称
            fields: ['age'],
        }
    ]
});

// 4.创建一条数据(一条记录)
let u = new User();
u.name = 'zs';
u.age = 33;
u.gender = '男';

u.save();

本质上让 MySQL 执行 SQL 语句是一个异步的操作,所以在 sequelize 中大部分的方法都是 异步方法:

这样的话可以利用一个立即执行的函数加 await 进行改造一下如上的代码如下:

// 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: {
            // varchar(255)
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        age: {
            type: Sequelize.TINYINT,
            defaultValue: 66
        },
        gender: {
            type: Sequelize.ENUM(['男', '女', '妖']),
            defaultValue: '妖'
        }
    }, {// 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,
        // 自定义表名
        // tableName: 'student',
        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false,
        // 指定索引
        indexes: [
            {
                // 索引名称
                name: 'idx_age',
                // 索引字段名称
                fields: ['age'],
            }
        ]
    });

    // 4.创建一条数据(一条记录)
    let u = new User();
    u.name = 'ww';
    u.age = 33;
    u.gender = '男';

    await u.save();
})();

注意点
通过模型类创建出来的对象中有一个 dataValues 的属性, 这个属性就保存了一条记录所有的信息。调用 save 方法保存完数据之后,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: {
            // varchar(255)
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        age: {
            type: Sequelize.TINYINT,
            defaultValue: 66
        },
        gender: {
            type: Sequelize.ENUM(['男', '女', '妖']),
            defaultValue: '妖'
        }
    }, {// 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,
        // 自定义表名
        // tableName: 'student',
        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false,
        // 指定索引
        indexes: [
            {
                // 索引名称
                name: 'idx_age',
                // 索引字段名称
                fields: ['age'],
            }
        ]
    });

    // 4.创建一条数据(一条记录)
    let u = new User();
    u.name = 'BTang';
    u.age = 33;
    u.gender = '男';

    console.log('保存之前:', u);
    await u.save();
    console.log('保存之后:', u);
})();

如上是保存之前的数据信息,如下图当中是保存之后的发现,保存之后 id 自动帮我们设置上去了,保存之前可是没有的。

除了如上的创建数据的方式,其实还有另外一个方式,在创建完成之后同时可以进行添加数据,等同于 创建对象 + 调用 save(); 而且它在创建和添加完成之后还会把添加之后的数据进行返回你可以进行接收返回进行使用:

// 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: {
            // varchar(255)
            type: Sequelize.STRING,
            allowNull: false,
            unique: true
        },
        age: {
            type: Sequelize.TINYINT,
            defaultValue: 66
        },
        gender: {
            type: Sequelize.ENUM(['男', '女', '妖']),
            defaultValue: '妖'
        }
    }, {// 告诉 sequelize 不需要自动将表名变成复数
        freezeTableName: true,
        // 自定义表名
        // tableName: 'student',
        // 不需要自动创建 createAt / updateAt 这两个字段
        timestamps: false,
        // 指定索引
        indexes: [
            {
                // 索引名称
                name: 'idx_age',
                // 索引字段名称
                fields: ['age'],
            }
        ]
    });

    // 4.创建一条数据(一条记录)
    let user = await User.create({
        name: "Jonathan_Lee",
        age: 18,
        gender: "男"
    });

    console.log(user.dataValues);
})();

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