此係列文章的應用示例已發佈於 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 }, })
若是你有適用於全部副本的常規設置,則不須要爲每一個實例單獨提供它們。在上面的代碼中,數據庫名稱和端口被傳播到全部副本。對於用戶和密碼也是如此, 若是你把它們用於任何一個副本。每一個副本都有如下選項:host
,port
,username
,password
,database
。tcp
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發佈。
爲了使 Sequelize 與 MySQL 完美結合,您須要安裝 mysql2@^1.0.0-rc.10
或更高版本。 一旦完成,你能夠這樣使用它:
const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mysql' })
注意: 您能夠經過設置 dialectOptions
參數將選項直接傳遞給方言庫. 查看 Options
獲取例子 (目前只支持mysql).
對於 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 的庫是 pg@^5.0.0 || ^6.0.0 || ^7.0.0
你只須要定義方言:
const sequelize = new Sequelize('database', 'username', 'password', { // 定義爲 postgres dialect: 'postgres' })
MSSQL 的庫是 tedious@^1.7.0
你只須要定義方言:
const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mssql' })
因爲經常使用簡單的方式來執行原始/已經準備好的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 支持, 謝謝.