sequelize入门
在使用NodeJS来关系型操作数据库时,为了方便,通常都会选择一个合适的ORM(Object Relationship Model)框架。毕竟直接操作SQL比较繁琐,通过ORM框架,我们可以使用面向对象的方式来操作表。
安装
$ npm install --save co
$ npm install --save sequelize
$ npm install --save mysql
代码模板
var Sequelize = require('sequelize');
var co = require('co');
co(function* () {
// code here
}).catch(function(e) {
console.log(e);
});
建立数据库连接
var sequelize = new Sequelize(
'db_entry', // 数据库名
'root', // 用户名
'', // 用户密码
{
'dialect': 'mysql', // 数据库使用mysql
'host': 'localhost', // 数据库服务器ip
'port': 3306, // 数据库服务器端口
'define': {
// 字段以下划线(_)来分割(默认是驼峰命名风格)
'underscored': true
}
}
);
建立表ORM
# 用户信息表
create TABLE xxts_users(
id INT(11) NOT NULL AUTO_INCREMENT,
username varchar(30) NOT NULL,
password VARCHAR(30) NOT NULL,
sex INT(2) NOT NULL DEFAULT 1,
age VARCHAR(10) NULL,
photo VARCHAR(30) NULL,
realname VARCHAR(30) NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id)
);
var User = sequelize.define(
// 这个值还会作为访问模型相关的模型时的属性名,所以建议用小写形式
'xxts_users',
// 字段定义(主键、created_at、updated_at默认包含,不用特殊定义)
{
'username': {
'type': Sequelize.STRING(30),
'allowNull': false
},
'password': {
'type': Sequelize.STRING(30),
'allowNull': false
},
'sex': {
'type': Sequelize.INTEGER(2),
'allowNull': false
},
'age': {
'type': Sequelize.STRING(10),
'allowNull': true
},
'photo': {
'type': Sequelize.STRING(30),
'allowNull': true
},
'realname': {
'type': Sequelize.STRING(30),
'allowNull': true
}
},
{
// 自定义表名
'freezeTableName': true,
'tableName': 'xxts_users',
// 是否需要增加createdAt、updatedAt、deletedAt字段
'timestamps': true,
// 不需要createdAt字段
// 'createdAt': false,
// 将updatedAt字段改个名
//'updatedAt': 'utime'
// 将deletedAt字段改名
// 同时需要设置paranoid为true(此种模式下,删除数据时不会进行物理删除,而是设置deletedAt为当前时间
// 'deletedAt': 'dtime',
// 'paranoid': true
}
);
说明:
建表SQL会自动执行的意思是你主动调用sync的时候。类似这样:User.sync({force: true});(加force:true,会先删掉表后再建表)。我们也可以先定义好表结构,再来定义Sequelize模型,这时可以不用sync。两者在定义阶段没有什么关系,直到我们真正开始操作模型时,才会触及到表的操作,但是我们当然还是要尽量保证模型和表的同步(可以借助一些migration工具)。
增删改查
通过Sequelize获取的模型对象都是一个DAO(Data Access Object)对象,这些对象会拥有许多操作数据库表的实例对象方法(比如:save、update、destroy等),需要获取“干净”的JSON对象可以调用get({‘plain’: true})。
通过模型的类方法可以获取模型对象(比如:findById、findAll等)。
// 增加
function user_add() {
co(function*() {
var user = yield User.create({
username: "小明",
password: "技术部",
sex: 2,
age: 32,
photo: "photo.jpg",
realname: "admin"
});
console.log(user.get({ plain: true }));
}).catch(function(e) {
console.log(e);
});
}
// 修改
function user_update(){
co(function*() {
var user = yield User.update({
username: "小白白"
},{
where:{
id:1
}
});
console.log("更新成功");
}).catch(function(e) {
console.log(e);
});
}
// 删除
function user_destroy(){
co(function*() {
var user = yield User.destroy({
where:{
id:1
}
});
console.log("删除成功");
}).catch(function(e) {
console.log(e);
});
}
// 查询
function user_query(){
co(function*() {
var user = yield User.findAll().spread(function(item, created){
console.log(item.get({ plain: true }));
});
}).catch(function(e) {
console.log(e);
});
}
user_query();