Sequelize 学习使用(1)模型 / 字段类型 / 实例操作

// 连接数据库
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 })
})

posted @ 2020-12-31 13:33  MarkJacobs  阅读(633)  评论(0)    收藏  举报