ORM框架 Sequelize

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’}});

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335