nodejs mysql orm sequelize 筆記(一)

有個朋友說, java 沒有 orm 就不用操做數據庫了, 感受 orm 好厲害的樣子。 帶着好奇,學起了 sequelize。java

sequelize

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個字段idcreateAtupdateAt, 並且 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 的增刪改查。

相關文章
相關標籤/搜索