https://sequelize.org/master/manual/getting-started.html
ORM
ORM 是「对象关系映射」的翻译,英语全称为Object Relational Mapping,它是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的「虚拟对象数据库」
它用来把对象模型表示的对象,映射到基于 SQL 的关系模型数据库结构中去。这样,我们在具体的操作实体数据库的时候,就不需要再去和复杂的 SQL 语句打交道,只需简单的操作实体对象的属性和方法,就可以达到操作数据库的效果
ORM 技术是在对象和数据库之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化
Sequelize 就是一款比较流行的 ORM 框架。
Sequelize
通过 Sequelize 框架,我们将每个数据表直接定义为数据模型,通过调用数据模型的一些方法,就可以直接操作数据库,甚至是同步数据表结构。
创建连接对象,并模块化
var Sequelize = require('sequelize');
// 数据库配置文件
var sqlConfig = {
host: "localhost",
user: "root",
password: "Lupeng1",
database: "example-sequelize"
};
var sequelize = new Sequelize(sqlConfig.database, sqlConfig.user, sqlConfig.password, {
host: sqlConfig.host,
dialect: 'mysql',
pool: {
max: 10,
min: 0,
idle: 10000
}
});
module.exports = sequelize;
根据数据库的一些参数,创建了sequelize数据库连接模块,并对外引用
定义数据表结构
在models目录中创建todolist.js文件
var Sequelize = require('sequelize');
var sequelize = require('./dbConn.js');
var todolist = sequelize.define('todolist',{
id: {
type: Sequelize.BIGINT(11),
primaryKey: true,
allowNull: false,
unique: true,
autoIncrement: true
},
title: Sequelize.STRING(100), // 标题
content: Sequelize.STRING(500), // 详细内容
priority: Sequelize.INTEGER, // 级别
owner: Sequelize.STRING, // 承接人
officer: Sequelize.STRING, // 负责人
startDate: Sequelize.STRING, // 开始时间
planFinishDate: Sequelize.STRING, // 计划完成时间
realFinishDate: Sequelize.STRING, // 实际完成时间
bz: Sequelize.STRING(500), // 备注
state: Sequelize.INTEGER, // 状态
createdAt: Sequelize.BIGINT,
updatedAt: Sequelize.BIGINT,
createUser: Sequelize.STRING,
updateUser: Sequelize.STRING,
version: Sequelize.BIGINT
},{
timestamps: false // 不要默认时间戳
});
module.exports = todolist;
同步数据表结构
在/db目录下,新建syncTable.js,
var todolist = require('./models/todolist.js');
// 同步表结构
todolist.sync({
force: true // 强制同步,先删除表,然后新建
});
if (!isProd) { // 非生产环境
sequelize
.sync({ force: false })
.then(() => {
console.log('==dev: sync It worked!')
}, (err) => {
console.log('==dev: An error occurred while creating the table:', err)
})
}
// 仅当数据库名称以 '_test' 结尾时,它才会运行.sync()
sequelize.sync({ force: true, match: /_test$/ });
测试数据连接
//测试数据库链接
sequelize.authenticate().then(function() {
console.log("数据库连接成功");
}).catch(function(err) {
//数据库连接失败时打印输出
console.error(err);
throw err;
});
定义单张表
var User = sequelize.define(
// 默认表名(一般这里写单数),生成时会自动转换成复数形式
// 这个值还会作为访问模型相关的模型时的属性名,所以建议用小写形式’user’,
// 字段定义(主键、created_at、updated_at默认包含,不用特殊定义)
{
‘emp_id’:
{
‘type’: Sequelize.CHAR(10), // 字段类型’
allowNull’: false, // 是否允许为NULL
’unique’: true // 字段是否UNIQUE
},
’nick’: {
‘type’: Sequelize.CHAR(10),
’allowNull’: false
},
’department’: {
‘type’: Sequelize.STRING(64),
’allowNull’: true
}});
比如:
module.exports = function (sequelize, DataTypes) {
return sequelize.define('product_base', {
id: {
type: DataTypes.BIGINT,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
product_key: {
type: DataTypes.STRING(100),
allowNull: false
},
name: {
type: DataTypes.STRING(100),
allowNull: false,
defaultValue: ''
},
vision: {
type: DataTypes.STRING(200),
allowNull: false,
defaultValue: ''
},
mission: {
type: DataTypes.STRING(200),
allowNull: false,
defaultValue: ''
},
logo_url: {
type: DataTypes.STRING(200),
allowNull: false,
defaultValue: ''
},
product_detail: {
type: DataTypes.STRING(200),
allowNull: false,
defaultValue: ''
},
user_group: {
type: DataTypes.STRING(200),
allowNull: false,
defaultValue: ''
},
}, {
comment: 'XX表',
tableName: 'product_base',
timestamps: true,
})
}
增加
方法1:build后对象只存在于内存中,调用save后才操作db
var user = User.build({‘emp_id’: ‘1’,’nick’: ‘小红’,’department’: ‘技术部’});
user = yield user.save();
console.log(user.get({‘plain’: true}));// 方法2:直接操作db
var user = yield User.create({‘emp_id’: ‘2’,’nick’: ‘小明’,’department’: ‘技术部’});
console.log(user.get({‘plain’: true}));
修改
- // 方法1:操作对象属性(不会操作db),调用save后操作db
user.nick = ‘小白’;
user = yield user.save();
console.log(user.get({‘plain’: true})); - // 方法2:直接update操作db
user = yield user.update({‘nick’: ‘小白白’});
console.log(user.get({‘plain’: true}));
删除
yield user.destroy();
AND 条件
var users = yield User.findAll({‘where’: {‘$and’: [{‘id’: [1, 2]},{‘nick’: null}]}});
OR条件
var users = yield User.findAll({‘where’: {‘$or’: [{‘id’: [1, 2]},{‘nick’: null}]}});
NOT条件
var users = yield User.findAll({‘where’: {‘$not’: [{‘id’: [1, 2]},{‘nick’: null}]}});
排序
var users = yield User.findAll({‘order’: [[‘id’, ‘DESC’],[‘nick’]]});
分页
var countPerPage = 20,
currentPage = 5;
var users = yield User.findAll({
‘limit’: countPerPage, // 每页多少条
’offset’: countPerPage * (currentPage - 1) // 跳过多少条
});
查询一条数据
user = yield User.findById(1);user = yield User.findOne({‘where’: {‘nick’: ‘a’}});