有个朋友说, 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个字段id
、createAt
、updateAt
, 而且 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 的增删改查。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。