NodeJS的sequelize操作数据库(一)

278 阅读2分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

安装依赖

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

创建Sequelize实例连接数据库

const Sequelize = require('sequelize');

//方法1:单独传递参数
const sequelize = new Sequelize('database', 'username', 'password', {
  host: '127.0.0.1',
  dialect: /* 'mysql' | 'mariadb' | 'postgres' | 'mssql' 之一 */
});

// 方法2: 传递连接 URI
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');

Sequelize 将在初始化时设置连接池. 可以通过构造函数的 options 参数(使用options.pool)配置此连接池

const sequelize = new Sequelize(/* ... */, {
  // ...
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  }
});

authenticate API测试连接效果

sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

关闭连接

调用sequelize.close()

建立表的数据模型

  1. Sequelize.Model.init(属性,参数)
const Model = Sequelize.Model;
class User extends Model {}
User.init({
  // 属性
  name: {
    type: Sequelize.STRING,
    allowNull: false
  },
  age: {
    type: Sequelize.STRING
    // allowNull 默认为 true
  }
}, {
  sequelize,
  modelName: 'user'
  // 参数
});
  1. sequelize.define
const User = sequelize.define('user', {
  // 属性
  name: {
    type: Sequelize.STRING,
    allowNull: false
  },
  age: {
    type: Sequelize.STRING
    // allowNull 默认为 true
  }
}, {
  // 参数
});

users 的表,有 name 和 age 字段. 默认情况下,表名复数习惯形式user->users可以通过使用 freezeTableName:true 参数可以禁止表名复数user->user,Sequelize 默认为每个模型定义了字段id(主键),createdAtupdatedAt.,默认字段名也是可以修改和取消

我这里平常导出封装好的各个环境的连接好数据库的sequelize实例

// host.js
let config = {
  // 这是我们通过环境变量设置的
  host: process.env.HOST || "localhost",
  port: process.env.PORT || 6666,
  mysql_server: process.env.MYSQL_SERVER || "mysql://root:@localhost:6666/test_app"  // 本地开发数据库
}
module.exports = config
const Sequelize = require('sequelize');

let sequelize
let config = require("./host.js")

// 不同环境设置不同配置
switch (process.env.NODE_ENV) {
  case 'test':
    console.log('测试环境')
    break;
  case 'prod':
    console.log('生产环境')
    break;
  // 本地
  default:
    console.log('开发环境')
    console.log("数据库地址", config.mysql_server.split("@")[1])
}

sequelize = new Sequelize(config.mysql_server, {
  pool: {
    max: 5,
    min: 0,
    idle: 10000
  },
  // 每次查询datetime的字段,显示出来都是这种格式
  // 初始化Sequelize的时候传入dialectOptions参数
  // dialectOptions: {
  //   dateStrings: true,
  //   typeCast: true
  // },
  // logging: false,
  timezone: '+08:00'  //  解决时差 - 默认存储时间存在8小时误差
})

//测试数据库链接
sequelize.authenticate().then(function () {
  console.log("数据库连接成功");
}).catch(function (err) {
  //数据库连接失败时打印输出
  throw err;
});

exports.sequelize = sequelize;
exports.Sequelize = Sequelize;