3

有个朋友说, java 没有 orm 就不用操作数据库了, 感觉 orm 好厉害的样子。 带着好奇,学起了 sequelize。

sequelize

sequelize 是 nodejs 操作数据库的一个 orm(object-relational-mapping) 库, 支持 PostgreSQL、 MySQL、 SQLite 、MSSQL 数据库, 还是 promise 的调用方式,和支持连接池和事务还有防注入, 还有其他轻巧便利的功能,能大大提高数据库操作的效率。

安装

npm install --save sequelize

根据连接的数据库不同, 安装不同的数据库操作模块, 比如连接 mysql 就要安装 mysql2 模块, 不然会报错, 数据库依赖模块如下:

$ npm install --save pg pg-hstore
$ npm install --save mysql2
$ npm install --save sqlite3
$ npm install --save tedious // MSSQL

连接

实例化 Sequelize 就是建立连接, 参数分别是数据库名(数据库必须存在该数据库),用户名,密码, options。

var Sequelize = require('sequelize');
var sequelize = new Sequelize('test', 'root', 'abc123', {
    host: 'localhost',
    dialect: 'mysql'      // 数据库类型 , 必须字段, 不然会报错
});
// 测试是否连接成功
(async function(){
    try {
      // promise 结合 async 处理 callback 也是我选择 sequelize 的一个原因
        var connect = await sequelize.authenticate();
        console.log('Connection has been established successfully.');
    } catch(err) {
        console.error('err', err)
    }
})();

连接池

在建立连接的时候, 可以设置连接池,默认最小是0,最大是5。如果你是单线程的,你预期的最大线程是50, 那么最大值就设置50, 如果是多线程,就应该实例多个连接,连接池最大值取平均数。假如有5个线程,实例5个连接, 连接池的最大值就应该是 50/5 。连接池通过 pool 设置,如下。

var sequelize = new Sequelize('test', 'root', 'abc123', {
    host: 'localhost',
    dialect: 'mysql',
    pool: {
        max: 5,                             // 最大值
        min: 0,                          // 最小值
        acquire: 30000,           //
        idle: 10000                  // 闲时超时
    },
});

idle 参数是指闲置的连接超过多少毫秒被释放。 acquire 参数是指在建立连接出错的时候,在抛出错误之前,池子会尝试建立连接的最大时间,重新连接成功就不抛出错误,不行才再抛。

定义表

定义表是调用实例化后的 sequlize 的 define 办法,第一个参数是表格名,第二个参数是字段的定义,第三个参数是options,定义一个用户表如下

var User = sequelize.define('user', {
    name: {
        type: Sequelize.STRING
    },
    age: {
        type: Sequelize.INTEGER
    },
    desc: {
        type: Sequelize.TEXT
    }
}, {})
User.sync() ;

User.sync() 同步表格, 在 ternimal 会看到执行的 sql 语句

CREATE TABLE IF NOT EXISTS users (id INTEGER NOT NULL auto_increment , name VARCHAR(255), age INTEGER, desc TEXT, createdAt DATETIME NOT NULL, updatedAt DATETIME NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB;

从这条语句可以看到三个内容
1、用了 TABLE IF NOT EXISTS 来创建表格,不必自己建立表格;
2、看表格名是 users, 是定义表格名参数的复数;
3、自添加了3个字段idcreateAtupdateAt, 而且 id 是自增并且设置为了主键的, 很贴心;

对于第2、3个内容, 是 sequelize 默认行为, 可以通过 define 的第三参数来禁止

var User = sequelize.define('user', {
    name: {
        type: Sequelize.STRING
    },
    age: {
        type: Sequelize.INTEGER
    },
    desc: {
        type: Sequelize.TEXT
    }
}, {
    createdAt: false,                   // 禁止添加 createdAt 字段
    updatedAt: false,                  // 禁止添加 updatedAt 字段
    timestamps: false,               // 相当禁止了上面两项
    freezeTableName: true,        // 禁止修改标明为复数
})
User.sync() ;

接下来学习 sequlize 的增删改查。


combine
384 声望9 粉丝

引用和评论

0 条评论