有個朋友說, java 沒有 orm 就不用操做數據庫了, 感受 orm 好厲害的樣子。 帶着好奇,學起了 sequelize。java
sequelize 是 nodejs 操做數據庫的一個 orm(object-relational-mapping) 庫, 支持 PostgreSQL、 MySQL、 SQLite 、MSSQL 數據庫, 仍是 promise 的調用方式,和支持鏈接池和事務還有防注入, 還有其餘輕巧便利的功能,能大大提升數據庫操做的效率。node
npm install --save sequelizemysql
根據鏈接的數據庫不一樣, 安裝不一樣的數據庫操做模塊, 好比鏈接 mysql 就要安裝 mysql2
模塊, 否則會報錯, 數據庫依賴模塊以下:sql
$ npm install --save pg pg-hstore
$ npm install --save mysql2
$ npm install --save sqlite3
$ npm install --save tedious // MSSQL數據庫
實例化 Sequelize
就是創建鏈接, 參數分別是數據庫名(數據庫必須存在該數據庫),用戶名,密碼, options。npm
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 設置,以下。promise
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,定義一個用戶表以下app
var User = sequelize.define('user', { name: { type: Sequelize.STRING }, age: { type: Sequelize.INTEGER }, desc: { type: Sequelize.TEXT } }, {}) User.sync() ;
User.sync() 同步表格, 在 ternimal 會看到執行的 sql 語句async
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;
從這條語句能夠看到三個內容
一、用了 TABLE IF NOT EXISTS
來建立表格,沒必要本身創建表格;
二、看錶格名是 users
, 是定義表格名參數的複數;
三、自添加了3個字段id
、createAt
、updateAt
, 並且 id 是自增而且設置爲了主鍵的, 很貼心;
對於第二、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 的增刪改查。