https://sequelize.org/v5/manual/getting-started.html sequelize官方文档

https://sequelize.org/v5/class/lib/model.js~Model.html api
$ npm install —save sequelize
$ npm install —save pg pg-hstore # Postgres
$ npm install —save mysql2
$ npm install —save mariadb
$ npm install —save sqlite3
$ npm install —save tedious # Microsoft SQL Server

  1. const Sequelize = require('sequelize');
  2. const sequelize = new Sequelize('database', 'username', 'password', {
  3. host: 'url',
  4. port: 3306,
  5. dialect: 'mysql' // 数据库类型
  6. })
  7. sequelize
  8. .authenticate()
  9. .then(() => {
  10. console.log('Connection has been established successfully.');
  11. const Model = Sequelize.Model;
  12. class TestUser extends Model {}
  13. TestUser.init({
  14. xxxId: {
  15. type: Sequelize.INTEGER,
  16. // 设置为 false 表示 not null
  17. allowNull: false,
  18. field: 'roleId',
  19. unique: true,
  20. primaryKey: true, // 设置了主键,就不会自动增加id了
  21. autoIncrement: true, // 自增列
  22. },
  23. // attributes
  24. firstName: {
  25. type: Sequelize.STRING,
  26. allowNull: false
  27. },
  28. lastName: {
  29. type: Sequelize.STRING
  30. // allowNull defaults to true
  31. }
  32. }, {
  33. // 自增列,开始值
  34. initialAutoIncrement: 10000,
  35. sequelize,
  36. modelName: 'test_user',
  37. // options
  38. /** 表名称 */
  39. tableName: 'test_user',
  40. // 此属性约定是否自动创建,createdAt与updatedAt
  41. timestamps: false
  42. });
  43. // force: true 这沙雕参数会删表
  44. TestUser.sync({}).then(() => { // 创建表
  45. }).then(()=>{
  46. return TestUser.findAll().then(users => {
  47. console.log("All users:", JSON.stringify(users, null, 4));
  48. });
  49. }).then(()=>{
  50. sequelize.close();
  51. })
  52. // // Create a new user
  53. // User.create({ firstName: "Jane", lastName: "Doe" }).then(jane => {
  54. // console.log("Jane's auto-generated ID:", jane.id);
  55. // });
  56. // // Delete everyone named "Jane"
  57. // User.destroy({
  58. // where: {
  59. // firstName: "Jane"
  60. // }
  61. // }).then(() => {
  62. // console.log("Done");
  63. // });
  64. // // Change everyone without a last name to "Doe"
  65. // User.update({ lastName: "Doe" }, {
  66. // where: {
  67. // lastName: null
  68. // }
  69. // }).then(() => {
  70. // console.log("Done");
  71. // });
  72. // sequelize.close();
  73. })
  74. .catch(err => {
  75. console.error('Unable to connect to the database:', err);
  76. });
  77. /*
  78. 注意:设置SQLite
  79. 如果您使用的是SQLite,则应改用以下内容:
  80. const sequelize = new Sequelize({
  81. dialect: 'sqlite',
  82. storage: 'path/to/database.sqlite'
  83. });
  84. 注意:连接池(生产)
  85. 如果要从单个进程连接到数据库,则应仅创建一个Sequelize实例。Sequelize将在初始化时建立连接池。可以通过构造函数的options参数(使用options.pool)来配置此连接池,如以下示例所示:
  86. const sequelize = new Sequelize( ... , {
  87. // ...
  88. pool: {
  89. max: 5,
  90. min: 0,
  91. acquire: 30000,
  92. idle: 10000
  93. }
  94. });
  95. */
  1. const {Op} = Sequelize;
  2. await XXXModel.update({
  3. status: '1'
  4. }, {
  5. where: {
  6. status: {
  7. [Op.in]: ['2', '3', '4', '5']
  8. }
  9. }
  10. });
  11. [Op.and]: {a: 5} // 且 (a = 5)
  12. [Op.or]: [{a: 5}, {a: 6}] // (a = 5 或 a = 6)
  13. [Op.gt]: 6, // id > 6
  14. [Op.gte]: 6, // id >= 6
  15. [Op.lt]: 10, // id < 10
  16. [Op.lte]: 10, // id <= 10
  17. [Op.ne]: 20, // id != 20
  18. [Op.eq]: 3, // = 3
  19. [Op.not]: true, // 不是 TRUE
  20. [Op.between]: [6, 10], // 在 6 和 10 之间
  21. [Op.notBetween]: [11, 15], // 不在 11 和 15 之间
  22. [Op.in]: [1, 2], // 在 [1, 2] 之中
  23. [Op.notIn]: [1, 2], // 不在 [1, 2] 之中
  24. [Op.like]: '%hat', // 包含 '%hat'
  25. [Op.notLike]: '%hat' // 不包含 '%hat'
  26. [Op.iLike]: '%hat' // 包含 '%hat' (不区分大小写) (仅限 PG)
  27. [Op.notILike]: '%hat' // 不包含 '%hat' (仅限 PG)
  28. [Op.regexp]: '^[h|a|t]' // 匹配正则表达式/~ '^[h|a|t]' (仅限 MySQL/PG)
  29. [Op.notRegexp]: '^[h|a|t]' // 不匹配正则表达式/!~ '^[h|a|t]' (仅限 MySQL/PG)
  30. [Op.iRegexp]: '^[h|a|t]' // ~* '^[h|a|t]' (仅限 PG)
  31. [Op.notIRegexp]: '^[h|a|t]' // !~* '^[h|a|t]' (仅限 PG)
  32. [Op.like]: { [Op.any]: ['cat', 'hat']} // 包含任何数组['cat', 'hat'] - 同样适用于 iLike 和 notLike
  33. [Op.overlap]: [1, 2] // && [1, 2] (PG数组重叠运算符)
  34. [Op.contains]: [1, 2] // @> [1, 2] (PG数组包含运算符)
  35. [Op.contained]: [1, 2] // <@ [1, 2] (PG数组包含于运算符)
  36. [Op.any]: [2,3] // 任何数组[2, 3]::INTEGER (仅限PG)
  37. [Op.col]: 'user.organization_id' // = 'user'.'organization_id', 使用数据库语言特定的列标识符, 本例使用 PG

mysql 支持的类型

  1. CreateAt:创建时间
  2. UpdateAt:更新时间
  3. DeleteAt:被删除时间
  4. CreateBy:创建人
  5. UpdateBy:更新人
  6. IsDelete:伪删除字段
  7. CreateAtbigint
  8. UpdateAtbigint
  9. DeleteAtbigint
  10. CreateByvarchar
  11. UpdateByvarchar
  12. IsDeletetinyint

例子

  1. /** model/config/default.js */
  2. const Sequelize = require('sequelize');
  3. module.exports = {
  4. createdBy: {
  5. type: Sequelize.STRING,
  6. allowNull: false,
  7. field: 'created_by',
  8. },
  9. updatedBy: {
  10. type: Sequelize.STRING,
  11. field: 'updated_by'
  12. },
  13. deletedBy: {
  14. type: Sequelize.STRING,
  15. field: 'deleted_by'
  16. },
  17. createdAt: {
  18. type: Sequelize.DATE,
  19. allowNull: false,
  20. field: 'created_at'
  21. // allowNull defaults to true
  22. },
  23. updatedAt: {
  24. type: Sequelize.DATE,
  25. field: 'updated_at'
  26. // allowNull defaults to true
  27. },
  28. /** 删除时间 */
  29. deletedAt: {
  30. type: Sequelize.DATE,
  31. field: 'deleted_at'
  32. },
  33. /** 伪删除字段 伪删除字段 1 表示删除 */
  34. isDelete: {
  35. type: Sequelize.TINYINT,
  36. field: 'is_delete',
  37. defaultValue: 0
  38. }
  39. }
  1. /** model/application.js */
  2. const Sequelize = require('sequelize');
  3. const defaultInit = require('./config/default')
  4. const Model = Sequelize.Model;
  5. const { Op } = Sequelize;
  6. class Application extends Model { }
  7. module.exports = async (sequelize) => {
  8. Application.init({
  9. // attributes
  10. appName: {
  11. type: Sequelize.STRING,
  12. // 设置为 false 表示 not null
  13. allowNull: false,
  14. field: 'app_name',
  15. unique: true,
  16. },
  17. ...defaultInit
  18. }, {
  19. sequelize,
  20. /** 表名称 */
  21. tableName: 'application_list',
  22. /** 模型名称 */
  23. modelName: 'application_list',
  24. // options
  25. // 此属性约定是否自动创建,createdAt与updatedAt
  26. timestamps: false
  27. });
  28. return Application.sync({ force: true }).then(() => {
  29. return {
  30. destroy (appNames) {
  31. return Application.destroy({ where: { appName: { [Op.in]: appNames } } }).then(res => {
  32. if (Array.isArray(res) && res.length) {
  33. return true
  34. }
  35. return false
  36. });
  37. },
  38. delete (appNames) {
  39. const deletedAt = new Date()
  40. return Application.update({
  41. deletedAt: deletedAt,
  42. isDelete: 1
  43. }, { where: { appName: { [Op.in]: appNames } }, }).then(res => {
  44. // console.log(res) [ 0 ] 默认会返回这个
  45. if (Array.isArray(res) && res.length) {
  46. return true
  47. }
  48. return false
  49. })
  50. },
  51. getOne (appName) {
  52. return Application.findAll({
  53. where: {
  54. appName,
  55. isDelete: { [Op.ne]: 1 }
  56. },
  57. }).then(res => {
  58. return res[0]
  59. })
  60. },
  61. getAll () {
  62. return Application.findAll({ where: { isDelete: { [Op.ne]: 1 } } })
  63. },
  64. create ({
  65. appName,
  66. createdBy,
  67. updatedBy,
  68. createdAt,
  69. updatedAt
  70. }) {
  71. return Application.create({
  72. appName,
  73. createdBy,
  74. updatedBy,
  75. createdAt,
  76. updatedAt
  77. })
  78. }
  79. }
  80. })
  81. }
  1. /** model/index.js */
  2. const ApplicationInit = require('./application')
  3. module.exports = async (sequelize) => {
  4. const model = {}
  5. model.application = await ApplicationInit(sequelize)
  6. return model
  7. }
  1. if (data.length === 0) { // 初始化数据
  2. const createdBy = new Date()
  3. await Permissions.bulkCreate([
  4. {
  5. ruleId: 10000,
  6. ruleType: 'operator_rule', // 操作功能权限
  7. createdBy: '__system',
  8. createdAt: createdBy
  9. },
  10. {
  11. ruleId: 10001,
  12. ruleType: 'menu_rule', // 菜单权限
  13. createdBy: '__system',
  14. createdAt: createdBy
  15. },
  16. {
  17. ruleId: 10002,
  18. ruleType: 'page_item_rule', // 页面元素权限
  19. createdBy: '__system',
  20. createdAt: createdBy
  21. },
  22. {
  23. ruleId: 10003,
  24. ruleType: 'file_rule', // 文件权限
  25. createdBy: '__system',
  26. createdAt: createdBy
  27. }
  28. ])
  29. }

事务

  1. // 创建事务
  2. sequelize.transaction(function (t) {
  3. // 在事务中执行操作
  4. return User.create({username: 'itbilu.com', password: 'pwd', active: true}, {transaction:t})
  5. .then(function(user){
  6. return UserCheckin.create({userId: user.id, loginIp:'localhost'}, {transaction:t})
  7. });
  8. }).then(function (results){
  9. /* 操作成功,事务会自动提交 */
  10. }).catch(function(err){
  11. /* 操作失败,事件会自动回滚 */
  12. });
  13. return sequelize.transaction(function (t) {
  14. // 一些在事务中进行的操作
  15. }).then(function (result) {
  16. // Transaction 会自动提交
  17. // result 是事务回调中使用promise链中执行结果
  18. }).catch(function (err) {
  19. // Transaction 会自动回滚
  20. // err 是事务回调中使用promise链中的异常结果
  21. });
  22. // 启动一个不受管理的事务
  23. return sequelize.transaction().then(function (t) {
  24. // 一些在事务中进行的操作
  25. return User.create({
  26. firstName: 'Homer',
  27. lastName: 'Simpson'
  28. }, {transaction: t}).then(function (user) {
  29. return user.addSibling({
  30. firstName: 'Lisa',
  31. lastName: 'Simpson'
  32. }, {transaction: t});
  33. }).then(function () {
  34. // 手工提交事务
  35. return t.commit();
  36. }).catch(function (err) {
  37. // 手工回滚事务
  38. return t.rollback();
  39. });
  40. });