Nodejs ORM框架Sequelize快速入门

什么是ORM?

简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全、可维护的SQL代码。直观上,是一种Model和SQL的映射关系。

  1. const User = sequelize.define('user', {
  2. id: {
  3. type: Sequelize.INTEGER,
  4. allowNull: false,
  5. autoIncrement: true,
  6. primaryKey: true
  7. },
  8. email: {
  9. type: Sequelize.STRING,
  10. allowNull: false,
  11. validate: {
  12. isEmail: true
  13. },
  14. unique: true
  15. }
  16. })
  1. CREATE TABLE IF NOT EXISTS `users` (
  2. `id` INTEGER PRIMARY KEY AUTOINCREMENT,
  3. `email` VARCHAR(255) NOT NULL UNIQUE
  4. `createdAt` DATETIME NOT NULL,
  5. `updatedAt` DATETIME NOT NULL,
  6. UNIQUE (email)
  7. );

那么什么是Sequelize?

Sequelize是一款基于Nodejs功能强大的异步ORM框架。

同时支持PostgreSQL, MySQL, SQLite and MSSQL多种数据库,很适合作为Nodejs后端数据库的存储接口,为快速开发Nodejs应用奠定扎实、安全的基础。

既然Nodejs的强项在于异步,没有理由不找一个强大的支持异步的数据库框架,与之配合,双剑合并~

  1. //引入框架
  2. var Sequelize = require('sequelize');
  3. //初始化链接(支持连接池)
  4. var sequelize = new Sequelize('database', 'username', 'password', {
  5. host: 'localhost',
  6. dialect: 'mysql'|'sqlite'|'postgres'|'mssql',
  7. pool: {
  8. max: 5,
  9. min: 0,
  10. idle: 10000
  11. },
  12. // SQLite only
  13. storage: 'path/to/database.sqlite'
  14. });
  15. //定义数据模型
  16. var User = sequelize.define('user', {
  17. username: Sequelize.STRING,
  18. birthday: Sequelize.DATE
  19. });
  20. //初始化数据
  21. sequelize.sync().then(function() {
  22. return User.create({
  23. username: 'janedoe',
  24. birthday: new Date(1980, 6, 20)
  25. });
  26. }).then(function(jane) {
  27. //获取数据
  28. console.log(jane.get({
  29. plain: true
  30. }));
  31. }).catch(function (err) {
  32. //异常捕获
  33. console.log('Unable to connect to the database:', err);
  34. });

Sequelize有哪些特色?

强大的模型定义,支持虚拟类型。Javascript虽然被很多人诟病杂乱无章法,但是函数即对象这个特色,可以说是我的最爱,非常灵活强大。

  1. var Foo = sequelize.define('foo', {
  2. firstname: Sequelize.STRING,
  3. lastname: Sequelize.STRING
  4. }, {
  5. getterMethods : {
  6. fullName : function() { return this.firstname + ' ' + this.lastname }
  7. },
  8. setterMethods : {
  9. fullName : function(value) {
  10. var names = value.split(' ');
  11. this.setDataValue('firstname', names.slice(0, -1).join(' '));
  12. this.setDataValue('lastname', names.slice(-1).join(' '));
  13. },
  14. }
  15. });

支持完善的数据验证,减轻前后端的验证压力。

  1. var ValidateMe = sequelize.define('foo', {
  2. foo: {
  3. type: Sequelize.STRING,
  4. validate: {
  5. is: ["^[a-z]+$",'i'], // 全匹配字母
  6. is: /^[a-z]+$/i, // 全匹配字母,用规则表达式写法
  7. not: ["[a-z]",'i'], // 不能包含字母
  8. isEmail: true, // 检查邮件格式
  9. isUrl: true, // 是否是合法网址
  10. isIP: true, // 是否是合法IP地址
  11. isIPv4: true, // 是否是合法IPv4地址
  12. isIPv6: true, // 是否是合法IPv6地址
  13. isAlpha: true, // 是否是字母
  14. isAlphanumeric: true, // 是否是数字和字母
  15. isNumeric: true, // 只允许数字
  16. isInt: true, // 只允许整数
  17. isFloat: true, // 是否是浮点数
  18. isDecimal: true, // 是否是十进制书
  19. isLowercase: true, // 是否是小写
  20. isUppercase: true, // 是否大写
  21. notNull: true, // 不允许为null
  22. isNull: true, // 是否是null
  23. notEmpty: true, // 不允许为空
  24. equals: 'specific value', // 等于某些值
  25. contains: 'foo', // 包含某些字符
  26. notIn: [['foo', 'bar']], // 不在列表中
  27. isIn: [['foo', 'bar']], // 在列表中
  28. notContains: 'bar', // 不包含
  29. len: [2,10], // 长度范围
  30. isUUID: 4, // 是否是合法 uuids
  31. isDate: true, // 是否是有效日期
  32. isAfter: "2011-11-05", // 是否晚于某个日期
  33. isBefore: "2011-11-05", // 是否早于某个日期
  34. max: 23, // 最大值
  35. min: 23, // 最小值
  36. isArray: true, // 是否是数组
  37. isCreditCard: true, // 是否是有效信用卡号
  38. // 自定义规则
  39. isEven: function(value) {
  40. if(parseInt(value) % 2 != 0) {
  41. throw new Error('请输入偶数!')
  42. }
  43. }
  44. }
  45. }
  46. });

Sequelize的查询非常全面和灵活

  1. Project.findAll({
  2. //复杂过滤,可嵌套
  3. where: {
  4. id: {
  5. $and: {a: 5} // AND (a = 5)
  6. $or: [{a: 5}, {a: 6}] // (a = 5 OR a = 6)
  7. $gt: 6, // id > 6
  8. $gte: 6, // id >= 6
  9. $lt: 10, // id < 10
  10. $lte: 10, // id <= 10
  11. $ne: 20, // id != 20
  12. $between: [6, 10], // BETWEEN 6 AND 10
  13. $notBetween: [11, 15], // NOT BETWEEN 11 AND 15
  14. $in: [1, 2], // IN [1, 2]
  15. $notIn: [1, 2], // NOT IN [1, 2]
  16. $like: '%hat', // LIKE '%hat'
  17. $notLike: '%hat' // NOT LIKE '%hat'
  18. $iLike: '%hat' // ILIKE '%hat' (case insensitive) (PG only)
  19. $notILike: '%hat' // NOT ILIKE '%hat' (PG only)
  20. $overlap: [1, 2] // && [1, 2] (PG array overlap operator)
  21. $contains: [1, 2] // @> [1, 2] (PG array contains operator)
  22. $contained: [1, 2] // <@ [1, 2] (PG array contained by operator)
  23. $any: [2,3] // ANY ARRAY[2, 3]::INTEGER (PG only)
  24. },
  25. status: {
  26. $not: false, // status NOT FALSE
  27. }
  28. }
  29. })
  30. Project.all()
  31. Project.findById
  32. Project.findByOne
  33. Project.findOrCreate
  34. Project.findAndCountAll
  35. Project.count()
  36. Project.max()
  37. //CRUD
  38. Project.create()
  39. Project.save()
  40. Project.update()
  41. Project.destroy()
  42. //批量
  43. User.bulkCreate([])
  44. //排序
  45. something.findOne({
  46. order: [
  47. 'name',
  48. // 返回 `name`
  49. 'username DESC',
  50. // 返回 `username DESC`
  51. ['username', 'DESC'],
  52. // 返回 `username` DESC
  53. sequelize.fn('max', sequelize.col('age')),
  54. // 返回 max(`age`)
  55. [sequelize.fn('max', sequelize.col('age')), 'DESC'],
  56. // 返回 max(`age`) DESC
  57. [sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
  58. // 返回 otherfunction(`col1`, 12, 'lalala') DESC
  59. [sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC']
  60. // 返回 otherfunction(awesomefunction(`col`)) DESC, 有可能是无限循环
  61. [{ raw: 'otherfunction(awesomefunction(`col`))' }, 'DESC']
  62. // 也可以这样写
  63. ]
  64. })
  65. // 分页查询
  66. Project.findAll({ limit: 10 })
  67. Project.findAll({ offset: 8 })
  68. Project.findAll({ offset: 5, limit: 5 })
  69. //关联查询 include 支持嵌套,这可能是ORM里面最难的部分。
  1. var User = sequelize.define('user', { name: Sequelize.STRING })
  2. , Task = sequelize.define('task', { name: Sequelize.STRING })
  3. , Tool = sequelize.define('tool', { name: Sequelize.STRING })
  4. Task.belongsTo(User) // 增加外键属性 UserId 到 Task
  5. User.hasMany(Task) // 给 Task 增加外键属性 userId
  6. User.hasMany(Tool, { as: 'Instruments' }) // 给 Task 增加自定义外键属性 InstrumentsId
  7. Task.findAll({ include: [ User ] })
  8. User.findAll({ include: [{
  9. model: Tool,
  10. as: 'Instruments',
  11. where: { name: { $like: '%ooth%' } }
  12. }] })
  13. User.findAll({ include: ['Instruments'] })
  14. var User = this.sequelize.define('user', {/* attributes */}, {underscored: true})
  15. , Company = this.sequelize.define('company', {
  16. uuid: {
  17. type: Sequelize.UUID,
  18. primaryKey: true
  19. }
  20. });
  21. User.belongsTo(Company); // 增加 company_uuid 外键属性到 user
  22. User.belongsTo(UserRole, {as: 'role'});
  23. // 自定义外键属性 roleId 到 user 而不是 userRoleId
  24. User.belongsTo(Company, {foreignKey: 'fk_companyname', targetKey: 'name'}); // 增加自定义外键属性 fk_companyname 到 User
  25. Person.hasOne(Person, {as: 'Father', foreignKey: 'DadId'})
  26. // Person 增加外键属性 DadId
  27. Coach.hasOne(Team) // `coachId` 作为 Team 的外键属性
  28. Project.hasMany(User, {as: 'Workers'})
  29. // 给 User 增加外键属性 projectId / project_id
  30. Project.belongsToMany(User, {through: 'UserProject'});
  31. User.belongsToMany(Project, {through: 'UserProject'});
  32. // 创建新的模型: UserProject 包含外键属性:projectId 和 userId

Sequelize还有完善的迁移同步数据方案,migrate so easy。

  1. //$ sequelize db:migrate //用命令直接生成模版脚本,接下来的还是写js
  2. module.exports = {
  3. up: function(queryInterface, Sequelize) {
  4. // 需要修改数据库的操作
  5. },
  6. down: function(queryInterface, Sequelize) {
  7. // 取消修改的操作
  8. }
  9. }

Nodejs ORM框架Sequelize快速入门的更多相关文章

  1. Nodejs ORM框架Sequelize(模型,关联表,事务,循环,及常见问题)

    1.建立连接 const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username ...

  2. Node.js ORM 框架 sequelize 实践

    最近在做团队的一个内部系统,这次使用的nodejs web框架是团队统一的hapi.js,而数据库依然是mysql,ORM 框架选用有着6000+ stars 的 sequelize.js,hapi- ...

  3. ssm框架整合快速入门

    写在前面: 公司一直都是使用ssh框架(Struts2,Spring,Hibernate)来开发,但是现在外面的公司大多数都是使用的ssm框架,所以也有必要多学习一下外面的新技术.这里就快速搭建一个小 ...

  4. Hibernate入门第一讲——Hibernate框架的快速入门

    Hibernate框架的概述 什么是框架? 框架指的是软件的半成品,已经完成了部分功能. JavaEE开发的三层架构 了解框架的基本概念之后,我们就来看看Hibernate框架处于JavaEE开发的经 ...

  5. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

  6. [jbdj]SpringMVC框架(1)快速入门

    1)springmvc快速入门(传统版) 步一:创建springmvc_demo一个web应用 步二:导入springioc,springweb , springmvc相关的jar包 步三:在/WEB ...

  7. 【前端】nodejs的ORM框架sequelize的工厂化

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/sequelize_factory.html 一.什么是sequelize nodejs的后台在操作数据库的时候,需 ...

  8. Shiro安全框架【快速入门】就这一篇!

    Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro™ is a powerful and easy-to-use Java security framework that perfo ...

  9. 【Koa】385- koa框架的快速入门与使用

    点击上方"前端自习课"关注,学习起来~ 简介 Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小. ...

随机推荐

  1. vue从入门到精通之【vuex】(七)

    vue从入门到精通之[vuex](七) vuex一个公用的大仓库,Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架. Vuex 实现了一个单向数据流,在全局拥有一个 state 存放数据, ...

  2. 基于Java swing+mysql+eclipse的【水电费管理系统】

    本项目为前几天收费帮学妹做的一个项目,Java swing项目,在工作环境中基本使用不到,但是很多学校把这个当做编程入门的项目来做,故分享出本项目供初学者参考. CSDN9.9赞助下载: https: ...

  3. Java基础周测题,输入一个整数,输出所有能整除该整数的结果:

    需求说明: 输入一个整数,输出所有能整除该整数的结果: 实现代码: package demo; import java.util.Scanner; public class test1 { publi ...

  4. iis站点下发布多个vue项目

    记录一下iis上某个域名下发布多个vue项目的过程,主要分为webpack打包前的配置和iis重定向的配置. vue打包配置: 1.在webpack 配置文件中(以vue.config.js为例),指 ...

  5. mysql中文乱码或者中文报错

    当出现中文乱码或者执行包含中文的语句报错时,十有八九就是编码的问题,我们可以执行下面语句查看编码: SHOW VARIABLES LIKE '%char%' 显示 其中character_set_se ...

  6. css 基础 字体和文本样式

    字体样式处理font-size:30px:// 设置字体大小 font-weight:700://设置粗体 font-sytle:italic; //设置文字斜体 font-family: 斜体,宋体 ...

  7. Sentry 企业级数据安全解决方案 - Relay 项目配置

    内容整理自官方文档 系列 Sentry 企业级数据安全解决方案 - Relay 入门 Sentry 企业级数据安全解决方案 - Relay 运行模式 Sentry 企业级数据安全解决方案 - Rela ...

  8. concat模糊查询

    <if test="name!=null"> name like concat('%',concat(#{name},'%')) </if> choose ...

  9. vue部署服务器以及解决部署到apache路由出现404

    最近在开发cms的时候使用Vue.js框架,利用vue-route.vue-cli结合webpack编写了一个单页路由项目,自己在服务器端配置apache.部署完成后,访问没问题,从页面中点击跳转就会 ...

  10. AI系统——机器学习和深度学习算法流程

    终于考上人工智能的研究僧啦,不知道机器学习和深度学习有啥区别,感觉一切都是深度学习 挖槽,听说学长已经调了10个月的参数准备发有2000亿参数的T9开天霹雳模型,我要调参发T10准备拿个Best Pa ...