Sequelize 中文API文檔-1. 快速入門、Sequelize類
2016年05月20日 35766 聲明
Sequelize
類是引用sequlize
模塊後獲取一個頂級對象,我們通過它來創建sequlize
實例,也可以通過該對象來獲取模內其它對象的引用,如:Utils
工具類、Transaction
事務類等。創建實例後,可以通過實例來創建或定義Model
(模型)、執行查詢、同步數據庫結構等操作。
- 快速入門
Sequelize
類- 2.1
new Sequelize()
- 實例化 - 2.2
new Sequelize()
- 通過URI實例化 - 2.3
sequelize.models
- 實例中已定義的模型 - 2.4
sequelize.define()
- 模型定義 - 2.5
Sequelize
- 頂級對象 - 2.6
Utils
- 工具類 - 2.7
Promise
- Promise對象 - 2.8
QueryTypes
- 查詢類型枚舉 - 2.9
Validator
-validator.js
對象 - 2.10
Transaction
- 事務對象 - 2.11
Deferrable
- 延時對象 - 2.12
Instance
- 實例對象 - 2.13
Association
- 聯合關係對象 - 2.14
Error
- 錯誤對象 - 2.15
ValidationError
- 驗證失敗錯誤對象 - 2.16
DatabaseError
- 數據庫錯誤對象 - 2.17
TimeoutError
- 查詢超時錯誤對象 - 2.18
UniqueConstraintError
- 唯一性錯誤對象 - 2.19
ExclusionConstraintError
- 排出約束錯誤對象 - 2.20
ForeignKeyConstraintError
- 外鍵約束錯誤對象 - 2.21
ConnectionError
- 連接錯誤對象 - 2.22
ConnectionRefusedError
- 連接拒絕錯誤對象 - 2.23
AccessDeniedError
- 無訪問權限錯誤對象 - 2.24
HostNotFoundError
- 主機未找到錯誤對象 - 2.25
InvalidConnectionError
- 無效鏈接錯誤對象 - 2.26
ConnectionTimedOutError
- 鏈接超時錯誤對象 - 2.27
InstanceError
- 實例錯誤對象 - 2.28
sequelize.getDialect()
- 返回數據庫類型 - 2.29
sequelize.getQueryInterface()
- 返回QueryInterface
實例 - 2.30
sequelize.define()
- 模型定義 - 2.31
sequelize.model()
- 獲取模型 - 2.32
sequelize.isDefined()
- 檢查模型是否定義 - 2.33
sequelize.import()
- 模型導入 - 2.34
sequelize.query()
- 執行查詢 - 2.35
sequelize.set()
- 設置變量 - 2.36
sequelize.escape()
- 編碼 - 2.37
sequelize.createSchema()
- 創建數據庫 schema - 2.38
sequelize.showAllSchemas()
- 查詢已定義的schema - 2.39
sequelize.dropSchema()
- 刪除定義的schema - 2.40
sequelize.dropAllSchemas()
- 刪除所有schema - 2.41
sequelize.sync()
- 同步模型到數據庫 - 2.42
sequelize.truncate()
- 截斷已定義的表 - 2.43
sequelize.drop()
- 刪除表 - 2.44
sequelize.authenticate()
- 驗證連接 - 2.45
sequelize.fn()
- 函數調用 - 2.46
sequelize.col()
- 列對象 - 2.47
sequelize.cast()
- cast函數 - 2.48
sequelize.literal()
- 字面量對象 - 2.49
sequelize.and()
- AND查詢 - 2.50
sequelize.or()
- OR查詢 - 2.51
sequelize.json()
- json嵌套對象 - 2.52
sequelize.where()
- 指定WHERE條件 - 2.53
sequelize.transaction()
- 啓動事務
- 2.1
1. 快速入門
1.1 安裝
Sequelize
可以通過npm
命令獲取,除安裝sequelize
模塊外還要安裝所使用數據的驅動模塊:
$ npm install --save sequelize # 還需要安裝以下之一: $ npm install --save pg pg-hstore // postgreSql $ npm install --save mysql // mysql 或 mariadb $ npm install --save sqlite3 $ npm install --save tedious // MSSQL
1.2 建立連接
Sequelize
會在初始化時設置一個連接池,這樣你應該爲每個數據庫創建一個實例:
var sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql'|'mariadb'|'sqlite'|'postgres'|'mssql', pool: { max: 5, min: 0, idle: 10000 }, // 僅 SQLite 適用 storage: 'path/to/database.sqlite' }); // 或者可以簡單的使用一個連接 uri var sequelize = new Sequelize('postgres://user:[email protected]:5432/dbname');
1.3 model
定義
model
定義格式爲sequelize.define('name',
{attributes}, {options})
:
var User = sequelize.define('user', { firstName: { type: Sequelize.STRING, field: 'first_name' // Will result in an attribute that is firstName when user facing but first_name in the database }, lastName: { type: Sequelize.STRING } }, { freezeTableName: true // Model 對應的表名將與model名相同 }); User.sync({force: true}).then(function () { // 已創建數據表 return User.create({ firstName: 'John', lastName: 'Hancock' }); });
1.4 Promise
Sequelize
基於Promise
實現異步流程控制,但其使用的並不是ECMAScript
6
中規定的標準Promise
對象,而是使用bluebird,這個模塊是對原生Promise
的一個擴展。
由於是基於Promise
實現的流程控制,所以不能像下面這樣獲取查詢值:
user = User.findOne() console.log(user.get('firstName'));
user
是一個promise
對象而不是
2. Sequelize
類
2.1 new Sequelize()
- 實例化
new Sequelize(database, [username=null], [password=null], [options={}])
require
引用後,會指向Sequelize
的主類的構造函數,引用後就可以通過new
關鍵字進行實例化,實例化後就會以連接池的形式連接到所使用的數據庫。語法結構如下:
var Sequelize = require('sequelize'); var sequelize = new Sequelize(database, [username=null], [password=null], [options={}])
實例化Sequelize
時,需要傳入數據庫名、用戶名和密碼,還可以傳入一個可選的options
參數對象。
實例化參數
名稱 | 類型 | 說明 |
---|---|---|
database | String | 數據庫名 |
[username=null] | String | 數據庫用戶名 |
[password=null] | String | 數據庫密碼 |
[options={}] | Object | 參數對象 |
[options.dialect='mysql'] | String | 要連接的數據庫類型。可選值有:mysql、postgres、sqlite、mariadb、mssql |
[options.dialectModulePath=null] | String | 指定後,將通過此路徑模塊加載數據庫 |
[options.dialectOptions] | Object | 路徑模塊所使用的擴展選項 |
[options.storage] | String | 僅用於sqlite, 默認爲':memory:' |
[options.host='localhost'] | String | 連接數據庫的主機 |
[options.port=] | String | 連接數據庫的端口 |
[options.protocol='tcp'] | String | 連接數據庫使用的協議 |
[options.define={}] | Object | 定義模型的選項,默認爲'sequelize.define'選項 |
[options.query={}] | Object | 'sequelize.query'的默認選項 |
[options.set={}] | Object | 'sequelize.set'的默認選項 |
[options.sync={}] | Object | 'sequelize.sync'的默認選項 |
[options.timezone='+00:00'] | String | 時間轉換時從數據庫得到的JavaScript時間。這個時區將應用於連接服務器的 NOW、CURRENT_TIMESTAMP或其它日期函數 |
[options.logging=console.log] | Function | 用於Sequelize日誌打印的函數 |
[options.omitNull=false] | Boolean | null值是否通過SQL查詢 |
[options.native=false] | Boolean | 是否使用本地庫,僅用於 postgres |
[options.replication=false] | Boolean |
是否使用讀/寫複製(讀寫分離)。
要啓用讀/寫複製,需要傳遞一個對象,這個對象有 |
[options.pool={}] | Object |
使用連接池連接,默認爲true |
[options.pool.maxConnections] | Integer | |
[options.pool.minConnections] | Integer | |
[options.pool.maxIdleTime] | Integer | 連接最大空置時間(毫秒),超時後將釋放連接 |
[options.pool.validateConnection] | Function | 連接驗證函數 |
[options.quoteIdentifiers=true] | Boolean |
設置爲false 時Postgres中會使表名和屬性大小寫不敏感,並跳過雙引號 |
[options.transactionType='DEFERRED'] | String |
設置事務類型,詳見Sequelize.Transaction.TYPES 。僅Sqlite適用 |
[options.isolationLevel='REPEATABLE_READ'] | String |
設置事件的隔離級別,詳見Sequelize.Transaction.ISOLATION_LEVELS |
[options.retry] | Object | 設置自動查詢時的重試標誌 |
[options.retry.match] | Array | 匹配到指定的錯誤字符串之一後重試查詢 |
[options.retry.max] | Integer | 設置重試次數 |
[options.typeValidation=false] | Boolean | 在插入、更新等操作時執行類型驗證 |
[options.benchmark=false] | Boolean | 在打印執行的SQL日誌時輸出執行時間(毫秒) |
Sequelize
實例化示例
// 不使用密碼和選項 var sequelize = new Sequelize('database', 'username') // 不使用選項 var sequelize = new Sequelize('database', 'username', 'password') // 不使用密碼/空密碼 var sequelize = new Sequelize('database', 'username', null, {}) // 使用密碼和選項 var sequelize = new Sequelize('my_database', 'john', 'doe', {})
Sequelize
實例化(初始化)有以上幾種形式,通過構造函數實例化後,就可以通過其返回的sequelize
實例定義Model
、執行query
查詢、執行transaction
等。
2.2 new Sequelize()
- 通過URI實例化
new Sequelize(uri, [options={}])
Sequelize
可以通過一個URI進行實例化:
// 使用Uri連接 var sequelize = new Sequelize('mysql://localhost:3306/database', {})
2.3 sequelize.models
- 實例中已定義的模型
sequelize.models
該實例屬性用於返回通過sequelize.define
定義的所有模型對象
sequelize.models; // 返回值如下 { User: User, UserRole: UserRole, …… }
2.4 sequelize.define()
- 模型定義
sequelize.define(modelName, attributes, [options]) -> Modal
這個實例方法用於定義一個新Model
(模型)。Model
相當於數據庫中的表,該對象不能通過構造函數實例化,而只能通過sequelize.define()
或sequelize.import()
方法創建。
表中的字段通過第二個參數對象attributes
來定義,對象中的一個屬性相當於表中的一個字段。
如,可以像下面這樣定義一個表:
sequelize.define('modelName', { columnA: { type: Sequelize.BOOLEAN, validate: { is: ["[a-z]",'i'], // will only allow letters max: 23, // only allow values <= 23 isIn: { args: [['en', 'zh']], msg: "Must be English or Chinese" } }, field: 'column_a' // Other attributes here }, columnB: Sequelize.STRING, columnC: 'MY VERY OWN COLUMN TYPE' }) sequelize.models.modelName // The model will now be available in models under the name given to define
2.5 Sequelize
- 頂級對象
var Sequelize = require('sequelize');
Sequelize
是一個指向sequelize模塊頂級對象引用,同時也是一個構造函數。可以通過該構造函數進行Sequelize
類的實例化;也可以通過該對象來訪問模塊中子對象,如:DataTypes
、Errors
、Transactions
等。
2.6 Utils
- 工具類
Sequelize.Utils
一個指定sequelize中工具類的引用,大多數情況下需要直接引用該對象,如:可以使用Sequelize.Utils._
屬性,該屬性是一個指向lodash
庫的引用,如果你項目中沒有另外引用該庫就可以通過該屬性來調用。
2.7 Promise
- Promise對象
Sequelize.Promise
該屬性是一個指向bluebird
Promise類型的引用。
2.8 QueryTypes
- 查詢類型枚舉
Sequelize.QueryTypes
用於sequelize.query
的表示查詢類型的枚舉對象。可用類型如下:
module.exports = { SELECT: 'SELECT', INSERT: 'INSERT', UPDATE: 'UPDATE', BULKUPDATE: 'BULKUPDATE', BULKDELETE: 'BULKDELETE', DELETE: 'DELETE', UPSERT: 'UPSERT', VERSION: 'VERSION', SHOWTABLES: 'SHOWTABLES', SHOWINDEXES: 'SHOWINDEXES', DESCRIBE: 'DESCRIBE', RAW: 'RAW', FOREIGNKEYS: 'FOREIGNKEYS', };
2.9 Validator
- validator.js
對象
Sequelize.Validator
一個指定validator.js
對象的引用,該對象用於Sequelize內部的驗證,如:非常、URL、IP等,也可以通過該屬性進行一些自定義驗證。
2.10 Transaction
- 事務對象
Sequelize.Transaction
該屬性是一個指向SequelizeTransaction
類的引用,要以使用這個屬性來訪問創建事務的隔離級別和事務類型等。
2.11 Deferrable
- 延時對象
Sequelize.Deferrable
指向一個延時集合的引用,通過個屬必可以訪問不通的延時選項。
2.12 Instance
- 實例對象
Sequelize.Instance
一個指定Sequelize實例類的引用。
2.13 Association
- 聯合關係對象
Sequelize.Association
一個指定Association
類的引用。
2.14 Error
- 錯誤對象
Sequelize.Error
Sequelize中生成錯誤的類
2.15 ValidationError
- 驗證失敗錯誤對象
Sequelize.ValidationError
驗證失敗時會生成此對象
2.16 DatabaseError
- 數據庫錯誤對象
Sequelize.DatabaseError
驗證失敗時會生成此對象
指向一個所有數據庫相關錯誤的類
2.17 TimeoutError
- 查詢超時錯誤對象
Sequelize.TimeoutError
當數據庫查詢超時時會生成TimeoutError
對象。
2.18 UniqueConstraintError
- 唯一性錯誤對象
Sequelize.UniqueConstraintError
當數違反唯一約束時會生成UniqueConstraintError
對象。
2.19 ExclusionConstraintError
- 排出約束錯誤對象
Sequelize.ExclusionConstraintError
在數據庫中違反排除約束時觸發此錯誤。
2.20 ForeignKeyConstraintError
- 外鍵約束錯誤對象
Sequelize.ForeignKeyConstraintError
在數據庫中違反外鍵約束時觸發此錯誤。
2.21 ConnectionError
- 連接錯誤對象
Sequelize.ConnectionError
一個指向數據庫連接錯誤時觸發的錯誤對象。
2.22 ConnectionRefusedError
- 連接拒絕錯誤對象
Sequelize.ConnectionRefusedError
一個指向數據庫連接被拒絕時觸發的錯誤對象。
2.23 AccessDeniedError
- 無訪問權限錯誤對象
Sequelize.AccessDeniedError
連接到數據庫但沒有訪問權限時會觸發此錯誤。
2.24 HostNotFoundError
- 主機未找到錯誤對象
Sequelize.HostNotFoundError
連接數據但主機名(IP或URI)未找到時會觸發這個錯誤對象。
2.25 InvalidConnectionError
- 無效鏈接錯誤對象
Sequelize.InvalidConnectionError
連接到數據庫但其中的任意參數出現錯誤時會觸發這個錯誤對象。
2.26 ConnectionTimedOutError
- 鏈接超時錯誤對象
Sequelize.ConnectionTimedOutError
連接數據庫超時時會觸發這個錯誤對象。
2.27 InstanceError
- 實例錯誤對象
Sequelize.InstanceError
當任何實例方法出現問題時會觸發這個錯誤對象。
2.28 sequelize.getDialect()
- 返回數據庫類型
sequelize.getDialect()
該實例方法用於返回實例類型(數據庫類型)
2.29 sequelize.getQueryInterface()
- 返回QueryInterface
實例
sequelize.getQueryInterface()
返回QueryInterface
的實例
2.30 sequelize.define()
- 模型定義
define(modelName, attributes, [options]) -> Model
定義一個模型,該模型是一個建立了與數據表關係的對象
被定義的表中的列在該方法的第二個參數中定義,可以理解爲每個屬性對應一個表的字段:
sequelize.define('modelName', { columnA: { type: Sequelize.BOOLEAN, validate: { is: ["[a-z]",'i'], // will only allow letters max: 23, // only allow values <= 23 isIn: { args: [['en', 'zh']], msg: "Must be English or Chinese" } }, field: 'column_a' // Other attributes here }, columnB: Sequelize.STRING, columnC: 'MY VERY OWN COLUMN TYPE' }) sequelize.models.modelName // The model will now be available in models under the name given to define
如上所示,列的定義可以是字符串、一個預定義的Sequelize構造函數、或是一個對象。在定義列時,我們可以指定數據類型,也可以指定默認值、主鍵/外鍵等約束,還可以自定義訪問器(getter)和設置器(setter)。
參數
名稱 | 類型 | 說明 |
---|---|---|
modelName | String |
模型名,在sequelize.models 屬性中會使用這個名稱;如果沒有在options 中指定表名,數據庫中也會使用此屬性做爲表名。 |
attributes | Object |
一個對象,其每個屬性對應表中的一個列,每個列可以使用一個預定義的DataType 、字符串或類型描述對象定義: |
attributes.column | String | DataType | Object | 數據庫中的列描述 |
attributes.column.type | String | DataType |
DataType 或字符串,表示列的數據類型 |
[attributes.column .allowNull=true] |
Boolean |
設置爲false 時,會給添加NOT
NULL (非空)約束,數據保存時會進行非空驗證 |
[attributes.column .defaultValue=null] |
Any |
字面默認值, JavaScript函數, 或一個 SQL 函數 (查看 sequelize.fn ) |
[attributes.column .unique=false] |
String | Boolean |
設置爲true 時,會爲列添加唯一約束 |
[attributes.column .primaryKey=false] |
Boolean | 指定是否是主鍵 |
[attributes.column .field=null] |
String | 設置在數據庫中的字段名。設置後會,Sequelize會將屬性名映射到數據庫中的不同名稱 |
[attributes.column .autoIncrement=false] |
Boolean | 是否自增 |
[attributes.column .comment=null] |
String |
字段描述(自1.7+ 後,此描述不再添加到數據庫中) |
[attributes.column .references=null] |
String | Model | 引用對象 |
[attributes.column .references.model] |
String | Model | 如果列引用到另一個表,可以通過這個屬性設置模型或字符串。 |
[attributes.column .references.key='id'] |
String | 該列表示到表外鍵列的引用 |
[attributes.column.onUpdate] | String | 當被引用的鍵更新時的操作,可選值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一 |
[attributes.column.onDelete] | String | 當被引用的鍵刪除時的操作,可選值是:CASCADE, RESTRICT, SET DEFAULT, SET NULL 或 NO ACTION 之一 |
[attributes.column.get] | Function |
爲列自定義一個訪問器。使用this.getDataValue(String) 時調用的值 |
[attributes.column.set] | Function |
爲列自定義一個設置器。使用this.setDataValue(String, Value) 時調用的值 |
[attributes.validate] | Object |
模型每次保存時調用的驗證對象。可是validator.js 中的驗證函數(參見 DAOValidator )、或自定義的驗證函數。 |
[options] | Object | 提供給Sequelize 構造函數的一些默認值 |
[options.defaultScope={}] | Object | 定義使用此模型的默認搜索範圍。作用範圍與提供給 find / findAll 的選項形式相同 |
[options.scopes] | Object |
更多範圍,定義 defaultScope 的定義形式相同。關於限制範圍的定義請參考Model.scope |
[options.omitNull] | Boolean | 是否忽略空值,這意味着,所有列的空值將不會被保存 |
[options.timestamps=true] | Boolean | 爲模型添加 createdAt 和 updatedAt 兩個時間戳字段 |
[options.paranoid=false] | Boolean |
使用邏輯刪除。設置爲true 後,調用 destroy 方法時將不會刪隊模型,而是設置一個 deletedAt 列。此設置需要 timestamps=true |
[options.underscored=false] | Boolean | 轉換列名的駝峯命名規則爲下劃線命令規則 |
[options.underscoredAll=false] | Boolean | 轉換模型名的駝峯命名規則爲表名的下劃線命令規則 |
[options.freezeTableName=false] | Boolean |
設置爲true 時,sequelize不會改變表名,否則可能會按其規則有所調整 |
[options.name] | Object |
允有singular 和 plural 兩個屬性的對象,在模型與其它模型關聯時使用 |
[options.name.singular= inflection.singularize(modelName)] |
String | |
[options.name.plural= inflection.pluralize(modelName)] |
String | |
[options.indexes] | Array.<Object> | 要建立的索引 |
[options.indexes[].name] | String | 索引名,默認爲模型名 + '_' + 字段名 |
[options.indexes[].type] | String |
索引類型,僅用於 mysql,其值爲:UNIQUE 、 FULLTEXT 或SPATIAL 之一 |
[options.indexes[].method] | String |
創建索引的方法(SQL中的USING 聲明)。BTREE 或 HASH 可以在 mysql 和 postgres中支持,postgres中支持,還支持 GIST 和 GIN |
[options.indexes[].unique=false] | Boolean |
設置索引是否唯一,設置後會自動觸發UNIQUE 設置 |
[options.indexes[] .concurrently=false] |
Boolean | PostgreSQL 中在創建索引時不使用任務寫鎖定。僅 Postgres 適用 |
[options.indexes[].fields] | Array.<String | Object> |
建立索引的字段數組。每個字段可以是一個字段名,sequelize 對象 (如 sequelize.fn ),或一個包含: attribute (字段名)、length (創建前綴字符數)、order (列排序方向)、collate (較驗的字段集合
(排序)) |
[options.createdAt] | String | Boolean |
如果爲字符串,則使用提供的值代替 createdAt 列的默認名,設置爲flase 則不添加這個字段。 |
[options.updatedAt] | String | Boolean |
如果爲字符串,則使用提供的值代替 updatedAt 列的默認名,設置爲flase 則不添加這個字段 |
[options.deletedAt] | String | Boolean |
如果爲字符串,則使用提供的值代替 deletedAt 列的默認名,設置爲flase 則不添加這個字段 |
[options.tableName] | String | 模型所對應表的表名,設置freezeTableName 爲 true時,纔會嚴格使用模型名 |
[options.getterMethods] | Object | 提供給 getter 調用的方法,與每列定義的訪問器一樣。如果爲列定義了一個相同名稱的 getter 方法,那麼會通過這個方法獲取值;如果未定義的名稱與列不匹配,這將做爲一個虛擬訪問器;也用於設置多個值,但不能用在。 |
[options.setterMethods] | Object | 提供給 setter 調用的方法,與每列定義的設置器一樣。如果爲列定義了一個相同名稱的 setter 方法,那麼會通過這個方法設置值;如果未定義的名稱與列不匹配,這將做爲一個虛擬訪設置;也用於匹配多個值,但不用於邏輯刪除。 |
[options.instanceMethods] | Object | 提供給每個實例(DAO)的方法。如果通過sequelize對方法進行了重寫,可以通過"this.constructor.super_.prototype"來調用原方法,如:this.constructor.super_.prototype.toJSON.apply(this, arguments) |
[options.classMethods] | Object |
添加到Model 的類方法,如果通過sequelize對方法進行了重寫,可以通過 this.constructor.prototype 來調用原方法,如:this.constructor.prototype.find.apply(this,
arguments) |
[options.schema='public'] | String | |
[options.engine] | String | |
[options.charset] | String | |
[options.comment] | String | |
[options.collate] | String | |
[options.initialAutoIncrement] | String | MySQL中設置 AUTO_INCREMENT (自增)的初始值 |
[options.hooks] | Object | 一個包含鉤子函數的對象,這些函數會在生生命週期內某些事件發生之前或之後被調用。可添加的鉤子函數有:beforeValidate, afterValidate, beforeBulkCreate, beforeBulkDestroy, beforeBulkUpdate, beforeCreate, beforeDestroy, beforeUpdate, afterCreate, afterDestroy, afterUpdate, afterBulkCreate, afterBulkDestory 和 afterBulkUpdate。每個屬性可以是一個函數,或是一個包含一組函數的數組。 |
[options.validate] | Object |
模型廣泛驗證對象。該驗證會通過this 。如果驗證函數中有參數,則會被認爲是異步的,並通過一個包含可選錯誤的回調函數形式的的調。 |
2.31 sequelize.model()
- 獲取模型
sequelize.model(modelName]) -> Model
獲取一個已經定義的模型。modelName
表示通過sequelize.define
定義的模型名。
2.32 sequelize.isDefined()
- 檢查模型是否定義
sequelize.isDefined(modelName) -> Boolean
檢查模型是否已經定義。modelName
表示通過sequelize.define
定義的模型名。
2.33 sequelize.import()
- 模型導入
sequelize.import(path) -> Model
通過文件導入模型定義。檢查模型是否已經定義。
被導入的模型會被緩存,所以多次導入並不會重複加載
path
表示要導入文件的路徑,如果使用相對路徑會自動轉換爲絕對路徑。
2.34 sequelize.query()
- 執行查詢
sequelize.query(sql, [options={}]) -> Promise
執行原始SQL 語句進行查詢
默認情況下,返回值中有兩個參數:一個包含結果的數組,一個元數據對象。可以通過.spread
方法來查看結果。
如果不想使用原始查詢結果,可以第二個可選參數中傳一個type
參數,並指定查詢的類型。設置後,sequelize會對結果進行格式化:
sequelize.query('SELECT...').spread(function (results, metadata) { // Raw query - use spread }); sequelize.query('SELECT...', { type: sequelize.QueryTypes.SELECT }).then(function (results) { // SELECT query - use then })
參數
名稱 | 類型 | 說明 |
---|---|---|
sql | String | |
[options={}] | Object | 查詢選項 |
[options.raw] | Boolean |
設置爲true 時,sequelize 不會查詢結果進行格式化,或不會根據結果構建實例 |
[options.transaction=null] | Transaction | 爲查詢指定事務 |
[options.type='RAW'] | String |
執行的查詢類型,sequelize會根據這個類型對返回結果格式化。可以設置爲一個字符串,或是通過Sequelize.QueryTypes 來設置 |
[options.nest=false] | Boolean |
設置爲true ,會使用dottie.js庫,轉換通過. 設置的對象層級關係。如:{
'user.username': 'john' } 會被轉換爲{ user: { username: 'john' }} 。設置true 後,查詢類型如未明確指定,則使用'SELECT' |
[options.plain=false] | Boolean |
設置查詢類型爲 SELECT 並返回單行結果 |
[options.replacements] | Object | Array |
替換:param 格式的查詢參數對象,或用於替換SQL中? 符號的參數數組 |
[options.bind] | Object | Array |
$param 格式綁定參數的對象,或未命令綁定參數數組,會替換SQL中的$1,
$2, ... |
[options.useMaster=false] | Boolean | 強制查詢使用寫池,而不管查詢類型 |
[options.logging=false] | Function | 一個用打印執行的SQL語句的函數 |
[options.instance] | Instance | 用於sequelize 實例,用於從查詢結果中構建實例 |
[options.model] | Model | 用於sequelize 模型,用於從查詢結果中構建實例 |
[options.retry] | Object | 設置自動重試的控制標識對象 |
[options.retry.match] | Array | 發生錯誤時,匹配到數組中的標識後自動重試 |
[options.retry.max] | Integer | 設置最大重試次數 |
[options.searchPath=DEFAULT] | String | 一個用於指定 schema 的 search_path 的可選項(僅 Postgres 適用) |
[options.supportsSearchPath] | Boolean | 是否使用 searchPath (僅 Postgres 適用) |
[options.mapToModel=false] | Object |
字段到模型的映射關係,當提供options.model 或 options.instance 時。映射會在建立模型實例之前進行 |
[options.fieldMap] | Object |
當爲 SELECT 查詢時,映射字段與屬性名 |
2.35 sequelize.set()
- 設置變量
sequelize.set(variables, options) -> Promise
設置一個變量,設置後將會執行基於環境變量或用戶變量的查詢。此變量會在每次建立連接時設置,僅MySQL 適用。
名稱 | 類型 | 說明 |
---|---|---|
variables | Object | 包含多個變量的對象 |
options | Object | 查詢選項 |
options.transaction | Transaction | 是否在事務中執行查詢 |
2.36 sequelize.escape()
- 編碼
sequelize.escape(value) -> String
對值value
進行編碼並返回編碼結果。
2.37 sequelize.createSchema()
- 創建數據庫 schema
sequelize.createSchema(schema, options={}) -> Promise
創建一個新的數據庫 schema
參數
名稱 | 類型 | 說明 |
---|---|---|
schema | String | schema 名 |
options | Object | 選項 |
options.logging | Boolean | function | 日誌打印函數 |
2.38 sequelize.showAllSchemas()
- 查詢已定義的schema
sequelize.showAllSchemas(options={}) -> Promise
查詢數據庫中已定義的schema
參數
名稱 | 類型 | 說明 |
---|---|---|
options | Object | 選項 |
options.logging | Boolean | function | 日誌打印函數 |
2.39 sequelize.dropSchema()
- 刪除定義的schema
sequelize.dropSchema(schema, options={}) -> Promise
刪除數據庫中已定義指定名稱的schema
參數
名稱 | 類型 | 說明 |
---|---|---|
schema | String | schema 名 |
options | Object | 選項 |
options.logging | Boolean | function | 日誌打印函數 |
2.40 sequelize.dropAllSchemas()
- 刪除所有schema
sequelize.dropAllSchemas(options={}) -> Promise
刪除數據庫中所有已定義的schema
參數
名稱 | 類型 | 說明 |
---|---|---|
options | Object | 選項 |
options.logging | Boolean | function | 日誌打印函數 |
2.41 sequelize.sync()
- 同步模型到數據庫
sequelize.sync([options={}]) -> Promise
同步所有已定義的模型到數據庫中
參數
名稱 | 類型 | 說明 |
---|---|---|
[options={}] | Object | |
[options.force=false] | Boolean | 設置爲 true,會在創建表前先刪除原表,即:DROP TABLE IF EXISTS ... |
[options.match] | RegEx |
添加匹配規則,只重建匹配的表,在force: true 時非常有用 |
[options.logging=console.log] | Boolean | function | 執行SQL的日誌打印函數 |
[options.schema='public'] | String |
創建表的 schema 。這一選項可以每個表的 sequelize.define 中重寫 |
[options.searchPath=DEFAULT] | String | 一個用於指定 schema 的 search_path 的可選項(僅 Postgres 適用) |
[options.hooks=true] | Boolean |
設置爲true 時,會調用同步相關的鉤子函數:beforeSync、afterSync、beforBulkSync、afterBulkSync |
2.42 sequelize.truncate()
- 截斷已定義的表
sequelize.truncate([options]) -> Promise
截斷所有已定義的模型所對應的表,這個操作實際上是調用每個模型的Model.truncate()
方法
參數
名稱 | 類型 | 說明 |
---|---|---|
options | Object | 選項 |
options.transaction | Boolean | function | |
options.logging | Boolean | function | 日誌打印函數 |
2.43 sequelize.drop()
- 刪除表
sequelize.drop(options) -> Promise
刪除所有已定義的模型所對應的表,這個操作實際上是調用每個模型的Model.drop()
方法
參數
名稱 | 類型 | 說明 |
---|---|---|
options | Object | 選項 |
options.logging | Boolean | function | 日誌打印函數 |
2.44 sequelize.authenticate()
- 驗證連接
sequelize.authenticate() -> Promise
驗證已建立的連接
別名:validate
2.45 sequelize.fn()
- 函數調用
sequelize.fn(fn, args) -> Sequelize.fn
創建於一個相當於數據庫函數的對象。該函數可用於搜索查詢的where
和order
部分,以及做爲列定義的默認值。如果想在列中引用你定義的函數,就要使用sequelize.col
,這樣列就能正確的解析,而不是解析爲字符串。
如,將username
字段值解析爲大寫形式:
instance.updateAttributes({ username: self.sequelize.fn('upper', self.sequelize.col('username')) })
名稱 | 類型 | 說明 |
---|---|---|
fn | String | 要調用的函數 |
args | any | 傳遞給調用函數的參數 |
2.46 sequelize.col()
- 列對象
col(col) -> Sequelize.col
創建一個相當於數據庫列的對象。這個方法經常結合sequelize.fn
使用,它可以保證將列名正確的傳遞給該方法,而不是經過轉義。
col
-表示列名
2.47 sequelize.cast()
- cast函數
cast(val, type) -> Sequelize.cast
創建一個表示cast函數調用的對象
val
-{any},cast的值type
-{String},cast類型
2.48 sequelize.literal()
- 字面量對象
literal(val) -> Sequelize.literal
創建一個字面量對象,該值不會轉義
別名:asIs
更多關於sequelize.literal()
的使用請參考:
2.49 sequelize.and()
- AND查詢
and(args) -> Sequelize.and
AND查詢
val
-{String | Object},會被AND連接的參數
2.50 sequelize.or()
- OR查詢
or(args) -> Sequelize.or
OR查詢
val
-{String | Object},會被OR連接的參數
2.51 sequelize.json()
- json嵌套對象
json(conditions, [value]) -> Sequelize.json
生成一個Postgre中json類型的嵌套對象
conditions
-{String | Object},一個能夠被postgres json 語法解析以的嵌套對象[value]
-{String | Object},可選的比較值,會生成 "<json path> = '<value>'"
2.52 sequelize.where()
- 指定WHERE條件
json(conditions, [value]) -> Sequelize.json
指定屬性=條件。
屬性也可以從Model.rawAttributes
對象獲取(如:Model.rawAttributes.id
、Model.rawAttributes.name
)。屬性應該已在模型中定義。也可以從sequelize工具函數中獲取(如:sequelize.fn,
、sequelize.col
當使用字符串屬性是,用於{ where: { attr: something }}
語法。如果不希望屬性被轉義,請使用sequelize.literal
。
attr
-{Object},屬性[comparator='=']
-{String}logic
-{String | Object},限制條件可以是簡單字符串或進一步的條件對象(如:$or
、$and
、.litera
)
別名:condition
2.53 sequelize.transaction()
- 啓動事務
sequlize.transaction([options={}]) -> Promise
啓動一個事務。當使用事務時,需要將事務做爲一個可選參數transaction
傳入,然後查詢就會在傳入的事務下執行:
sequelize.transaction().then(function (t) { return User.find(..., { transaction: t}).then(function (user) { return user.updateAttributes(..., { transaction: t}); }) .then(t.commit.bind(t)) .catch(t.rollback.bind(t)); })
事務支持自動提交或回滾,當使用promise鏈接調用時會自動完成:
sequelize.transaction(function (t) { // 注意,這時使用的是callback而不是promise.then() return User.find(..., { transaction: t}).then(function (user) { return user.updateAttributes(..., { transaction: t}); }); }).then(function () { // Committed }).catch(function (err) { // Rolled back console.error(err); });
啓用CLS
命名空間時,事務分被自動掛載。
var cls = require('continuation-local-storage'), ns = cls.createNamespace('....'); var Sequelize = require('sequelize'); Sequelize.cls = ns;
相關
參數
名稱 | 類型 | 說明 |
---|---|---|
[options={}] | Object | |
[options.autocommit=true] | Boolean | 是否自動提交 |
[options.type='DEFERRED'] | String |
查看Sequelize.Transaction.TYPES ,僅 Sqlite 適用 |
[options.isolationLevel ='REPEATABLE_READ'] |
String |
事務的隔離級別,參見Sequelize.Transaction.ISOLATION_LEVELS |
[options.logging=false] | Function | 用於打印執行SQL的函數 |