1

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();

learningCoder
42 声望1 粉丝

« 上一篇
learning koa2.x
下一篇 »
java-cmd 乱码