Nodejs ORM框架之 Sequelize 快速集成

Nodejs ORM框架之 Sequelize 快速集成

Sequelize是一个关系型数据库ORM框架,它基于Promise构建。支持MySQL、PostgreSQL、MariaDB、SQLite和MSSQL几种关系型数据库,功能非常强大。

安装

安装 sequelize

npm install --save sequelize

安装数据库驱动

根据你所使用的数据库类型,安装以下一个数据库驱动模块:

npm install --save pg pg-hstore  // PostgreSQL时安装
npm install --save mysql // MySQL 或 MariaDB 时安装
npm install --save sqlite3  // SQLite 时安装
npm install --save tedious // MSSQL时安装

建立连接

// file: config.json
const config = {
    "database": "database",
    "username": "username",
    "password": "password",
    "writeConnection": {
        "host": "127.0.0.1",
        "port": 3306,
        "dialect": "mysql",
        "timezone": "+08:00",
        "pool": {
            "max": 10,
            "min": 1,
            "idle": 10000
        },
        "retry": 5
    }
};

// file: models/index.js
// 创建连接
const sequelize = new Sequelize(config.database, config.username, config.password, {
  // 对象解构
  ...config.writeConnection,
  // 自定义日志
  logging: function (message) {
    console.debug(message);
  }
});

// 导入模型
const fs = require('fs');
const path = require('path');
let db = {};

fs
  .readdirSync([模型存放目录: __dirname])
  .filter(function (file) {
    return (file.indexOf('.') !== 0) && (file !== 'index.js');
  })
  .forEach(function (file) {
    const model = sequelize.import(path.join(__dirname, file))
    db[model.name] = model;
  });

// 模型关联
Object.keys(db).forEach(function (modelName) {
  if ('associate' in db[modelName]) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db

创建模型

// file: models/user.js
module.exports = function (sequelize, DataTypes) {
  return sequelize.define('User', {
    id: {
      type: DataTypes.INTEGER(11),
      primaryKey: true,
      autoIncrement: true,
      allowNull: false,
      field: 'id'
    },
    username: {
      type: DataTypes.STRING(20),
      allowNull: false,
      field: 'username',
      unique: 'CI_USERNAME'
    },
    password: {
      type: DataTypes.STRING(200),
      allowNull: false,
      field: 'password_hash'
    }
  }, {
    tableName: 'users', // 数据库表名
    freezeTableName: true,
    timestamps: true,
    charset: 'utf8',
    collate: 'utf8_general_ci',
    classMethods: {
      associate (models) {
        // do something
      }
    }
  });
}

使用

以下是一些简单的查询:

// 查询所有 users
User.findAll().then(users => {
  console.log("All users:", JSON.stringify(users, null, 4));
});

// 创建一个新 user
User.create({ firstName: "Jane", lastName: "Doe" }).then(jane => {
  console.log("Jane's auto-generated ID:", jane.id);
});

// 删除每个名为 "Jane" 的记录
User.destroy({
  where: {
    firstName: "Jane"
  }
}).then(() => {
  console.log("Done");
});

// 修改每个`lastName`为`null`的记录修改为"Doe"
User.update({ lastName: "Doe" }, {
  where: {
    lastName: null
  }
}).then(() => {
  console.log("Done");
});

参考

Sequelize