// 连接数据库
const { Sequelize, DataTypes, Model } = require('sequelize')
const sequelize = new Sequelize('study', 'root', '123456', {
host: 'localhost',
dialect: 'mysql',
})
// 测试连接
// sequelize.authenticate().then(() => {
// console.log('已连接')
// })
// 关闭连接
// sequelize.close().then(() => {
// console.log('已关闭')
// })
// 模型的定义
class User extends Model {
// Sequelize 模型是 ES6 类. 你可以非常轻松地添加自定义实例或类级别的方法.
getFullname() {
return [this.firstName, this.lastName].join(' ')
}
}
User.init(
{
firstName: {
type: DataTypes.STRING,
allowNull: false,
// unique: true,
// primaryKey: true,
// autoIncrement: true,
// references: {
// // 这是对另一个模型的参考
// model: Bar,
// // 这是引用模型的列名
// key: 'id',
// },
// comment: '这是带有注释的列',
},
lastName: {
type: DataTypes.STRING,
// allowNull 默认为 true
defaultValue: 'Jacobs', // 默认值为 NULL
},
time: {
type: DataTypes.DATE,
defaultValue: Sequelize.NOW,
},
age: {
type: DataTypes.INTEGER(10),
defaultValue: 1,
},
// 创建两个具有相同值的对象将引发错误.
// unique 属性可以是布尔值或字符串.
// 如果为多个列提供相同的字符串,则它们将形成一个复合唯一键.
uniqueOne: { type: DataTypes.STRING, unique: 'compositeIndex' },
uniqueTwo: { type: DataTypes.INTEGER, unique: 'compositeIndex' },
},
{
sequelize,
tableName: 'User',
// modelName: 'User', // 模型名称
// 不要忘记启用时间戳!
timestamps: true,
// 不想要 createdAt
createdAt: false,
// 想要 updatedAt 但是希望名称叫做 updateTimestamp
updatedAt: 'updateTimestamp',
}
)
// 模型同步
// User.sync() - 如果表不存在,则创建该表(如果已经存在,则不执行任何操作)
// User.sync({ force: true }) - 将创建表,如果表已经存在,则将其首先删除
// User.sync({ alter: true }) - 这将检查数据库中表的当前状态(它具有哪些列,它们的数据类型等),然后在表中进行必要的更改以使其与模型匹配.
User.sync({ alter: true })
// 删除与模型相关的表
// User.drop().then(() => {
// console.log('删除User表')
// })
// 删除所有的表
// sequelize.drop().then(() => {
// console.log('所有的表已经删除')
// })
// 默认数据类型
// 字符串
// DataTypes.STRING // VARCHAR(255)
// DataTypes.STRING(1234) // VARCHAR(1234)
// DataTypes.STRING.BINARY // VARCHAR BINARY
// DataTypes.TEXT // TEXT
// DataTypes.TEXT('tiny') // TINYTEXT
// 布尔
// DataTypes.BOOLEAN // TINYINT(1)
// 数字
// DataTypes.INTEGER // INTEGER
// DataTypes.BIGINT // BIGINT
// DataTypes.BIGINT(11) // BIGINT(11)
// DataTypes.FLOAT // FLOAT
// DataTypes.FLOAT(11) // FLOAT(11)
// DataTypes.FLOAT(11, 10) // FLOAT(11,10)
// DataTypes.REAL // REAL 仅 PostgreSQL.
// DataTypes.REAL(11) // REAL(11) 仅 PostgreSQL.
// DataTypes.REAL(11, 12) // REAL(11,12) 仅 PostgreSQL.
// DataTypes.DOUBLE // DOUBLE
// DataTypes.DOUBLE(11) // DOUBLE(11)
// DataTypes.DOUBLE(11, 10) // DOUBLE(11,10)
// DataTypes.DECIMAL // DECIMAL
// DataTypes.DECIMAL(10, 2) // DECIMAL(10,2)
// 无符号和零填充整数
// DataTypes.INTEGER.UNSIGNED
// DataTypes.INTEGER.ZEROFILL
// DataTypes.INTEGER.UNSIGNED.ZEROFILL
// 你还可以指定大小,即INTEGER(10)而不是简单的INTEGER
// 同样适用于 BIGINT, FLOAT 和 DOUBLE
// 日期
// DataTypes.DATE // DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
// DataTypes.DATE(6) // DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
// DataTypes.DATEONLY // 不带时间的 DATE
// UUID
// {
// type: DataTypes.UUID,
// defaultValue: Sequelize.UUIDV4 // 或 Sequelize.UUIDV1
// }
// 增加
User.create({ firstName: 'Mark' }).then(async (user) => {
// 使用类中自定义的方法
console.log(user.getFullname())
// 打印实例记录
console.log(user.toJSON())
// 打印字段值
console.log(user.firstName)
// 删除实例
// user.destroy()
// 重载实例
// user.reload()
// 保存部分字段
user.firstName = 'Cathy' //更新实例的字段
await user.save({ fields: ['firstName'] }) //更新数据库中的字段
await user.reload() // 从数据库中重新查询
console.log(user.toJSON())
// 递增
await user.increment({ age: 2 })
await user.increment(['age'], { by: 2 })
})