Sequelize 中文文檔 v4 - Basic usage - 基本用法

Basic usage - 基本用法

此係列文章的應用示例已發佈於 GitHub: sequelize-docs-Zh-CN. 能夠 Fork 幫助改進或 Star 關注更新. 歡迎 Star.mysql

在開始以前,你首先必須建立一個 Sequelize 的實例。 像下面這樣:git

const sequelize = new Sequelize('database', 'username'[, 'password'])

這將會保存要傳遞的數據庫憑據並提供全部進一步的方法。此外,你還能夠指定非默認的主機或端口:github

const sequelize = new Sequelize('database', 'username', 'password', {
  host: "my.server.tld",
  port: 12345
})

若是你沒有密碼:sql

const sequelize = new Sequelize('database', 'username')
// 或
const sequelize = new Sequelize('database', 'username', null)

你也可使用鏈接字符串:數據庫

const sequelize = new Sequelize('mysql://user:pass@example.com:9821/dbname', {
  // 更多選項請看下一節
})

選項

除了主機和端口,Sequelize 還提供了一大堆選項。它們在這:數組

const sequelize = new Sequelize('database', 'username', 'password', {
  // 自定義主機; 默認值: localhost
  host: 'my.server.tld',
 
  // 自定義端口; 默認值: 3306
  port: 12345,
 
  // 自定義協議
  // - 默認值: 'tcp'
  // - 版本: v1.5.0
  // - 僅限 postgres, 用於 heroku
  protocol: null,
 
  // 禁用日誌; 默認值: console.log
  logging: false,
 
  // 數據庫的 sql 方言
  // - 當前支持: 'mysql', 'sqlite', 'postgres', 'mssql'
  dialect: 'mysql',
 
  // 你還能夠將任何方言選項傳遞到底層方言庫
  // - 默認是空
  // - 當前支持: 'mysql', 'postgres', 'mssql'
  dialectOptions: {
    socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock',
    supportBigNumbers: true,
    bigNumberStrings: true
  },
 
  // sqlite 的存儲引擎
  // - 默認值 ':memory:'
  storage: 'path/to/database.sqlite',
 
  // 禁止將未定義的值插入爲NULL
  // - 默認值: false
  omitNull: true,
 
  // 是否使用本地庫的標誌
  // 若是是 'pg' -- 設置爲 true 將容許 SSL 支持
  // - 默認值: false
  native: true,
 
  // 指定在調用 sequelize.define 時使用的選項
  // 以下示例:
  //   define: {timestamps: false}
  // 這基本等同於:
  //   sequelize.define(name, attributes, { timestamps: false })
  // 沒有必要像這樣去設置每一個定義的時間戳選項
  // 下面你看到的這些可能設置的鍵. 本章中都進行了說明
  define: {
    underscored: false
    freezeTableName: false,
    syncOnAssociation: true,
    charset: 'utf8',
    dialectOptions: {
      collate: 'utf8_general_ci'
    },
    timestamps: true
  },
 
  // 相似於同步:你能夠定義始終強制同步模型
  sync: { force: true },
 
  // 每次關聯後進行同步(見下文)。 若是設置爲 false,則須要在設置全部關聯後手動進行同步。 默認值: true
  syncOnAssociation: true,
 
  // 使用鏈接池來減小數據庫鏈接超載並提升速度
  // 當前僅支持 mysql 和 postgresql (從 v1.5.0 開始)
  pool: { max: 5, idle: 30},
 
  // 用於肯定如何根據 [lingo project](https://github.com/visionmedia/lingo) 將單詞翻譯成單數形式或複數形式
  // 選項爲: en [默認], es
  language: 'en',

  // 每一個事務的隔離級別. 默認是 REPEATABLE_READ
  // 可用選項:
  // READ_UNCOMMITTED
  // READ_COMMITTED
  // REPEATABLE_READ
  // SERIALIZABLE
  isolationLevel: Transaction.ISOLATION_LEVELS.REPEATABLE_READ
})

提示: 你能夠經過傳遞一個方法爲日誌部分設置一個自定義方法。第一個參數是將被記錄的字符串 。服務器

讀取複製

Sequelize 支持讀取複製,即在要執行 SELECT 查詢時能夠鏈接到多個服務器。 當你讀取複製時,你指定一個或多個服務器做爲讀取副本,一個服務器充當寫入主機,它處理全部寫入和更新,並將其傳播到副本(請注意,實際的複製進程爲 不是 由 Sequelize 處理,而應該在 MySql 中設置)。socket

const sequelize = new Sequelize('database', null, null, {
  dialect: 'mysql',
  port: 3306
  replication: {
    read: [
      { host: '8.8.8.8', username: 'anotherusernamethanroot', password: 'lolcats!' },
      { host: 'localhost', username: 'root', password: null }
    ],
    write: { host: 'localhost', username: 'root', password: null }
  },
  pool: { // 若是要覆蓋用於讀取池的選項,能夠在此處進行
    max: 20,
    idle: 30000
  },
})

若是你有適用於全部副本的常規設置,則不須要爲每一個實例單獨提供它們。在上面的代碼中,數據庫名稱和端口被傳播到全部副本。對於用戶和密碼也是如此, 若是你把它們用於任何一個副本。每一個副本都有如下選項:hostportusernamepassworddatabasetcp

Sequelize 使用池來管理與副本的鏈接。 默認選項爲:函數

{
  max: 5,
  min: 0,
  idle: 10000,
  acquire: 10000,
  evict: 60000,
  handleDisconnects: true  
}

若是要修改這些,能夠在實例化 Sequelize 時做爲選項傳遞池,如上所示。

注意: 讀複製當前只適用於MySQL!

方言

隨着 Sequelize 1.6.0 的發佈,庫能夠獨立於特定的方言。這意味着您必須本身添加相應的鏈接器庫到您的項目。版本 1.7.0 stable 已經與鏈接器庫(sequelize-mysql,sequelize-postgres等)捆綁在一塊兒發佈,可是這些軟件包沒有被維護,而且不會向2.0.0發佈。

MySQL

爲了使 Sequelize 與 MySQL 完美結合,您須要安裝 mysql2@^1.0.0-rc.10 或更高版本。 一旦完成,你能夠這樣使用它:

const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'mysql'
})

注意: 您能夠經過設置 dialectOptions 參數將選項直接傳遞給方言庫. 查看 Options
獲取例子 (目前只支持mysql).

SQLite

對於 SQLite 兼容性,您將須要 sqlite3 @〜3.0.0。 配置 Sequelize 以下所示:

const sequelize = new Sequelize('database', 'username', 'password', {
  // 設置成 sqlite
  dialect: 'sqlite',
 
  // sqlite 的存儲引擎
  // - default ':memory:'
  storage: 'path/to/database.sqlite'
})

或者您也可使用鏈接字符串以及路徑:

const sequelize = new Sequelize('sqlite:/home/abs/path/dbname.db')
const sequelize = new Sequelize('sqlite:relativePath/dbname.db')

PostgreSQL

PostgreSQL 的庫是 pg@^5.0.0 || ^6.0.0 || ^7.0.0 你只須要定義方言:

const sequelize = new Sequelize('database', 'username', 'password', {
  // 定義爲 postgres
  dialect: 'postgres'
})

MSSQL

MSSQL 的庫是 tedious@^1.7.0 你只須要定義方言:

const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'mssql'
})

執行原始 SQL 查詢

因爲經常使用簡單的方式來執行原始/已經準備好的SQL查詢,因此可使用「sequelize.query」函數。

這是它如何工做的:

// 原始查詢的參數
sequelize.query('your query', [, options])

// 簡單的例子
sequelize.query("SELECT * FROM myTable").then(myTableRows => {
  console.log(myTableRows)
})

// 若是要返回 sequelize 實例,請使用模型選項。
// 這樣,你能夠輕鬆地將查詢映射到預約義的sequelize模型,例如:
sequelize
  .query('SELECT * FROM projects', { model: Projects })
  .then(projects => {
    // 每一個記錄如今將映射到項目的模型。
    console.log(projects)
  })


// 選項是具備如下鍵的對象:
sequelize
  .query('SELECT 1', {
    // 用於記錄查詢的函數(或false)
    // 每一個發送到服務器的SQL查詢都會調用
    logging: console.log,

    // 若是 plain 是 TRUE ,則 sequelize 將只返回結果集的第一條記錄。
    // 若是是 FALSE, 則是所有記錄。
    plain: false,

    // 若是你沒有查詢的模型定義,請將其設置爲true。
    raw: false
  })

// 注意第二個參數爲null!
// 即便咱們在這裏聲明一個被調用,raw: true 將取代並返回一個原始對象。
sequelize
  .query('SELECT * FROM projects', { raw: true })
  .then(projects => {
    console.log(projects)
  })

查詢中的替換能夠經過兩種不一樣的方式完成:
使用命名參數(以:開頭),或者由未命名的

使用的語法取決於傳遞給函數的替換選項:

  • 若是一個數組被傳遞,? 將按照它們在數組中出現的順序被替換
  • 若是傳遞一個對象,:key將被該對象的鍵替換。若是包含在查詢中的對象未找到對應的鍵,則會拋出異常,反之亦然。
sequelize
  .query(
    'SELECT * FROM projects WHERE status = ?',
    { raw: true, replacements: ['active']
  )
  .then(projects => {
    console.log(projects)
  })

sequelize
  .query(
    'SELECT * FROM projects WHERE status = :status ',
    { raw: true, replacements: { status: 'active' } }
  )
  .then(projects => {
    console.log(projects)
  })

注意一點: 若是表的屬性名稱包含 " . ",則生成的對象將被嵌套:

sequelize.query('select 1 as `foo.bar.baz`').then(rows => {
  console.log(JSON.stringify(rows))

  /*
    [{
      "foo": {
        "bar": {
          "baz": 1
        }
      }
    }]
  */
})

若是這篇文章對您有幫助, 感謝 下方點贊 或 Star GitHub: sequelize-docs-Zh-CN 支持, 謝謝.

相關文章
相關標籤/搜索