sequelize ORM V6版本 https://sequelize.org/master/
sequelize中文网 https://www.sequelize.com.cn/
github https://github.com/sequelize/sequelize
github中文 https://github.com/demopark/sequelize-docs-Zh-CN
https://www.sequelize.com.cn/
API https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-constructor-constructor
https://sequelize.org/master/manual/getting-started.html

sequelize特点

  1. 基于 promise 的 Node.js ORM
  2. 具有强大的事务支持, 关联关系,
  3. 预读和延迟加载,读取复制等
  4. 可以使用 ES6 语法

在默认情况下,id字段会被设置为主键,并且是AUTO_INCREMENT的,不需要我们自己声明

  1. 数据表,用JS中的模型代替,class或对象
    1. 建模,外键,同步到数据库
  2. 一条用 JS中的一个对象
  3. 多条记录用数组代替
  4. sql语句,用对象方法代替
  5. Sequelize 以ORM的方式操作MySQL
    1. Model constructor的bug
    2. toJSON序列化

Sequelize 操作 mysql 数据库
Sequelize常用数据类型和条件判断
Sequelize 常用增删改查函数
mysql8无法使用本机ip访问的解决方式

mysql

为所选数据库安装驱动程序,例如:mysql2驱动 代替了 mysql

  1. npm install mysql2 sequelize -S
  2. # 连接其他数据库
  3. # 选择以下之一:
  4. npm install --save pg pg-hstore # Postgres
  5. npm install --save mysql2
  6. npm install --save mariadb
  7. npm install --save sqlite3
  8. npm install --save tedious # Microsoft SQL Server

sequelize连接 mysql

/config/db.config.js

  1. const dbConfig = {
  2. database: 'koa-cms',
  3. host: 'localhost',
  4. port: '3306',
  5. username: 'root',
  6. password: 'root'
  7. }
  8. module.exports = dbConfig

config/sequelize.config.js

  1. const {Sequelize} = require('sequelize')
  2. const {
  3. database, username, password, port, host,
  4. } = require('@config/db.config')
  5. // 指定数据库类型 要安装 MySQL驱动 mysql2
  6. const connect = {
  7. dialect: 'mysql',
  8. host,
  9. port,
  10. logging: true, // 操作数据库,cli显示原始 sql语句
  11. timezone: '+08:00', // 重要设置时区
  12. }
  13. // define 定义字段
  14. connect.define = {
  15. // timestamps: false, // 不会自动生成 createdAt updatedAt deleteAt
  16. paranoid: true,
  17. underscored: true, // 驼峰转下划线
  18. createdAt: 'created_at',
  19. updatedAt: 'updated_at',
  20. deletedAt: 'deleted_at',
  21. scopes: {
  22. excludeTime: {
  23. attributes: {
  24. exclude: ['updated_at', 'deleted_at', 'created_at']
  25. }
  26. }
  27. }
  28. }
  29. // 线上环境使用连接池
  30. // connect.pool = {
  31. // max: 5, // 连接池中最大的链接数量
  32. // min: 0,
  33. // idle: 10000 // 如果一个链接池 10s内没有被使用,就释放
  34. // acquire: 30000,
  35. // }
  36. /**
  37. * @description sequelize全局实例 Sequelize 4个参数
  38. * @param { string } 数据库名
  39. * @param { string } 数据库用户名
  40. * @param { string } 数据库密码
  41. * @param { object } connect连接数据库的配置项
  42. */
  43. const sequelize = new Sequelize(database, username, password, connect)
  44. module.exports = sequelize

models

  1. const {
  2. Model, Sequelize
  3. } = require('sequelize')
  4. const sequelize = require('@config/sequelize.config')
  5. // 定义一个模型
  6. class User extends Model {}
  7. // init 创建数据库
  8. User.init({
  9. id: {
  10. type: Sequelize.INTEGER,
  11. primaryKey: true,
  12. autoIncrement: true
  13. },
  14. username: Sequelize.STRING,
  15. openid: {
  16. type: Sequelize.STRING(64),
  17. unique: true
  18. },
  19. })
  20. module.exports = new User()

模型同步

  1. [model.sync(options)](https://sequelize.org/master/class/lib/model.js~Model.html#static-method-sync)
    1. [sequelize.sync()](https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-method-sync) 自动同步所有模型
    2. https://sequelize.org/master/class/lib/model.js~Model.html#static-method-sync
  2. User.sync({ force: true }) 创建表,如果表已经存在,则将其首先删除
    1. 不要用,会直接删除数据库重新创建
  3. User.sync({ alter: true }) 检查数据库中表,修改字段和模型匹配
    1. 不要用,会破坏原理的表
  1. await sequelize.sync({ force: true });
  2. console.log("所有模型均已成功同步.");
  3. // 仅当数据库名称以 '_test' 结尾时,它才会运行.sync()
  4. sequelize.sync({ force: true, match: /_test$/ });
  5. await User.drop();
  6. console.log("用户表已删除!");
  7. await sequelize.drop();
  8. console.log("所有表已删除!");

表前缀

  1. schema 前缀
  2. schemaDelimiter 连字符
  3. https://github.com/sequelize/sequelize/blob/master/src/model.js#L1500
  1. define: {
  2. schema: 'koa',
  3. schemaDelimiter: '_'
  4. }
  5. // koa_users

sequelize-cli

sequelize-cli工具来实现 migrations搬家

  1. npm install sequelize sequelize-cli --save
  2. npx sequelize-cli init # 生成配置文件
  3. /models/index.js

.sequelize.rc

项目根目录新建 .sequelizerc

  1. const path = require('path')
  2. module.exports = {
  3. // 指定配置文件路径
  4. config: path.join(__dirname, 'database/config.json'),
  5. // 存放表结构文件的路径
  6. 'migrations-path': path.join(__dirname, 'database/migrations'),
  7. // 存放种子文件的路径
  8. 'seeders-path': path.join(__dirname, 'database/seeders'),
  9. // 存放模型文件的路径 mongoose
  10. 'models-path': path.join(__dirname, 'database/models'),
  11. }

npx sequelize

修改环境变量:set NODE_ENV=test,连接不同的数据库

  1. npx sequelize init:migrations # 生成目录
  2. npx sequelize migration:generate --name=init-users
  3. npx sequelize db:migrate
  4. npx sequelize db:migrate:undo # 删除表

eggjs安装 mysql

安装msyql

  1. npm i egg-mysql -S

启用插件:config/plugin.js 启用 mysql插件

  1. exports.mysql = {
  2. enable: true,
  3. package: 'egg-mysql'
  4. }

eggjs安装 sequelize

安装

  1. npm install egg-sequelize mysql2 --save

启用插件:config/plugin.js 启用 sequelize插件

  1. exports.sequelize = {
  2. enable: true,
  3. package: 'egg-sequelize'
  4. }

ORM

ORM Object Relational Mapping 对象关系映射

  1. node操作 mysql:waterline,typeform,sequelize,typeORM
  2. nodejs中集成 sequelize
  3. 数据表,用js中的模型,【class或对象】代替
  4. 一条或多条记录,用js中的一个对象或数组代替
  5. sql语句,用对象的方法代替 sql语句

create.js

  1. const { Blog, User } = require('./model')
  2. // 异步调用数据库
  3. ;(async function() {
  4. })()

sequelize 总结

避免for循环查询数据库
Op.in in查询避免循环查询数据库

group分组查询
Model中禁止使用构造函数 constructor

Sequelize的坑

  1. models 定义的 class类不能使用 构造函数 constructor
    • new class会创建对象,导致写库时的 id是个对象,而不是数字报错
  2. scope 事务

链接 mysql

  1. 安装 mysql2驱动
    node-application - ORM sequelize - 驱动 mysql2 - mysql

操作数据库,依赖模型 models/user

数据搬家 migration

返回数据的细节

this.dataValues 不受 get方法的影响,存储的是 原始的值
循环导入优化:
模块的导入,变成函数内部的局部导入

数据查询

循环查询数据库是危险的行为
查询不可控,把不可控的查询次数,变为可控的查询
in 查询 id 数组 [10, 20, 30]

group 分组
Sequelize.fn(‘SUM’, ‘score’) 求和,对 score

sequelize连接mysql报错

through socket ‘/tmp/mysql.sock’

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

  1. ln 设置MAMP的软连接
  1. ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock

Error: connect ECONNREFUSED 127.0.0.1:3306

  1. mysql 这个连接库是可以使用 socketPath 这个属性指定 Unix 套接字文件
  2. dialectOptions 设置 mysql 的属性
  1. const connect = {
  2. dialect: 'mysql',
  3. host,
  4. port,
  5. logging: true, // 操作数据库,cli显示原始 sql语句
  6. timezone: '+08:00', // 重要设置时区
  7. dialectOptions: {
  8. socketPath: '/tmp/mysql.sock' // 指定套接字文件路径
  9. }
  10. }

Sequelize术语

  1. Sequelize 是指库本身, sequelize 是指 Sequelize 的实例,表示与一个数据库的连接
  2. 连接到数据库,必须创建一个 Sequelize 实例
    1. const sequelize = new Sequelize(database, username, password, connect)
    2. 在阅读 Sequelize 文档时在本地运行代码示例,帮助你更快地学习
  3. 基于 promise 的 Node.js ORM,所有方法现都使用 async/await. 公共 API 返回原生 promises
  4. inflection复数表名 https://www.npmjs.com/package/inflection

参考资料

https://blog.csdn.net/yaodong379/article/details/97621301