1:Sequelize 類
Sequelize是引用Sequelize模塊獲取的一個頂級對象,通過這個類可以獲取模塊內對其他對象的引用。比如utils、Transaction事務類。通過這個頂級對象創建實例后(連接數據庫),可以使用這個實例定義模型,使用這個模型進行sql操作
1.1 創建實例 這個實例就是數據庫連接對象
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'
});
1.2 定義model
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名相同
});
1.3 創建表
User.sync({force: true}).then(function () {
// 已創建數據表
return User.create({
firstName: 'John',
lastName: 'Hancock'
});
});
force:如果為true 如果原來存在,則將原來的表刪除,並創建新的
如果為false 創建表,如果原來存在,則不創建
2:api new Sequelize() - 實例化 創建連接
new Sequelize(database, [username=null], [password=null], [options={}])
參數介紹:
database: 數據庫名
username=nul String類型 數據庫用戶名
password=null string類型 注意:就算全部都是數字,也應該是字符串數字,不然會報錯
options={}:參數對象
options.dialect='mysql’ String類型 要連接的數據庫類型。可選值有:mysql、postgres、sqlite、mariadb、mssql
[options.host='localhost' String 連接數據庫的主機
options.port 連接數據庫的端口
options.define={} 預先定義的model
options.logging=console.log Function 用於Sequelize日志打印的函數
options.pool={} 對數據庫連接池的配置
3: api 定義模型以及原始查詢
sequelize.models: 獲取在創建連接時,預先定義的model模型
sequelize.define(): 定義model
define(modelName, attributes, [options]) -> Model
以下為屬性介紹:
modelName:表名
attributes:是一個對象,對列的描述主要屬性如下:等號的意思是默認值
attributes.column:列的名字
attributes.column.type:列的數據類型
列的數據類型的介紹:
Sequelize.STRING// VARCHAR(255)
Sequelize.STRING(1234)// VARCHAR(1234)
Sequelize.STRING.BINARY // VARCHAR BINARY
Sequelize.TEXT// TEXT
Sequelize.TEXT('tiny')// TINYTEXT
Sequelize.INTEGER// INTEGER
Sequelize.BIGINT// BIGINT
Sequelize.BIGINT(11)// BIGINT(11)
Sequelize.FLOAT// FLOAT
Sequelize.FLOAT(11)// FLOAT(11)
Sequelize.FLOAT(11, 12)// FLOAT(11,12)
Sequelize.REAL// REAL PostgreSQL only.
Sequelize.REAL(11)// REAL(11) PostgreSQL only.
Sequelize.REAL(11, 12)// REAL(11,12) PostgreSQL only.
Sequelize.DOUBLE// DOUBLE
Sequelize.DOUBLE(11)// DOUBLE(11)
Sequelize.DOUBLE(11, 12)// DOUBLE(11,12)
Sequelize.DECIMAL// DECIMAL
Sequelize.DECIMAL(10, 2)// DECIMAL(10,2)
Sequelize.DATE// DATETIME for mysql / sqlite, TIMESTAMP WITH TIME ZONE for postgres
Sequelize.DATE(6)// DATETIME(6) for mysql 5.6.4+. Fractional seconds support with up to 6 digits of precision
Sequelize.DATEONLY// DATE without time.
Sequelize.BOOLEAN// TINYINT(1)
Sequelize.ENUM('value 1', 'value 2')// An ENUM with allowed values 'value 1' and 'value 2'
Sequelize.ARRAY(Sequelize.TEXT)// Defines an array. PostgreSQL only.
Sequelize.JSON// JSON column. PostgreSQL only.
Sequelize.JSONB// JSONB column. PostgreSQL only.
Sequelize.BLOB// BLOB (bytea for PostgreSQL)
Sequelize.BLOB('tiny')// TINYBLOB (bytea for PostgreSQL. Other options are medium and long)
Sequelize.UUID// PostgreSQL 和 SQLite 中為 UUID, MySQL 中為CHAR(36) BINARY (使用 defaultValue: Sequelize.UUIDV1 或 Sequelize.UUIDV4 生成默認值)
Sequelize.RANGE(Sequelize.INTEGER)// Defines int4range range. PostgreSQL only.
Sequelize.RANGE(Sequelize.BIGINT)// Defined int8range range. PostgreSQL only.
Sequelize.RANGE(Sequelize.DATE)// Defines tstzrange range. PostgreSQL only.
Sequelize.RANGE(Sequelize.DATEONLY)// Defines daterange range. PostgreSQL only.
Sequelize.RANGE(Sequelize.DECIMAL)// Defines numrange range. PostgreSQL only.
Sequelize.ARRAY(Sequelize.RANGE(Sequelize.DATE))// Defines array of tstzrange ranges. PostgreSQL only.
Sequelize.GEOMETRY// Spatial column. PostgreSQL (with PostGIS) or MySQL only.
Sequelize.GEOMETRY('POINT')// Spatial column with geomerty type. PostgreSQL (with PostGIS) or MySQL only.
Sequelize.GEOMETRY('POINT', 4326)// Spatial column with geomerty type and SRID. PostgreSQL (with PostGIS) or MySQL only.
attributes.column.allowNull=true:Boolean值,為false時,會添加非空約束。
attributes.column.defaultValuee=null:列的默認值
attributes.column.unique=false:是否添加唯一性約束,為true時添加唯一性約束
attributes.column.primaryKey=false:是否為主鍵
attributes.column.field=null:設置當前子段在數據庫中的名字。默認是column的值,如果添加這個屬性,那么數據庫中的字段名便是此值
attributes.column.autoIncrement=false:Boolean值,是否自增長
attributes.column.validate:模型驗證,在對數據執行改變時,先驗證是否符合要求。 // 一般使用代碼驗證
以下是設置外鍵。。根據了解,現在公司一般不設置表與表之間的關系
attributes.column.references:引用對象。設置這個屬性證明這個鍵是外鍵
attributes.column.references.model:這屬性指向一個model。
attributes.column.references.key='id‘:另一個model的主鍵
bar_id:{
type:Sequelize.INTEGER,
references:{
//這是引用另一個模型
model:Bar,
//這是引用模型的列名稱
key:'id'} }
option是一個對象,以下是對options的字段介紹:
options.timestamps: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.createdAt:Boolean值或字符串。。如果為字符串,則使用提供的值代替 createdAt 列的默認名,設置為flase則不添加這個字段。
個人理解就是為這個字段起別名
options.updatedAt:同上
options.deletedAt:同上
options.tableName:模型所對應表的表名,設置freezeTableName 為 true時,才會嚴格使用模型名
options.initialAutoIncrement:String類型 MySQL中設置 AUTO_INCREMENT (自增)的初始值
options.hooks:一個包含鈎子函數的對象,這些函數會在生生命周期內某些事件發生之前或之后被調用。可添加的鈎子函數有:beforeValidate,
afterValidate, beforeBulkCreate, beforeBulkDestroy, beforeBulkUpdate, beforeCreate, beforeDestroy, beforeUpdate, afterCreate,
afterDestroy, afterUpdate, afterBulkCreate, afterBulkDestory 和 afterBulkUpdate。每個屬性可以是一個函數,或是一個包含一組函 數的數組
3:api 對數據庫的操作 一般用不到
sequelize.createSchema(schema, options={}) -> Promise:創建數據庫schema
sequelize.showAllSchemas() - 查詢已定義的schema
sequelize.dropSchema() - 刪除定義的schema
sequelize.dropAllSchemas() - 刪除所有schema
sequelize.sync() - 同步模型到數據庫 (這個有用)
sequelize.drop() - 刪除表
sequelize.authenticate() - 驗證連接
sequelize.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));
})
sequelize.getDialect():該實例方法用於返回實例類型(數據庫類型)
sequelize.getQueryInterface():返回QueryInterface的實例 這對象的內置方法主要是對表的操作,增刪改查
Sequelize.Utils:工具類
Sequelize.QueryTypes:查詢類型枚舉 猜測是模型執行sql時使用。暫不清楚用法
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',
};
Sequelize.Validator: 對象用於Sequelize內部的驗證,如:非常、URL、IP等,也可以通過該屬性進行一些自定義驗證。
Sequelize.Transaction: 事物對象
Sequelize.Instance: 指向數據庫連接對象
Sequelize.Association: 指向Association類
4:數據庫的錯誤類型
Sequelize.Error: 錯誤對象
Sequelize.ValidationError: 驗證失敗成此對象
Sequelize.DatabaseError: 數據庫錯誤對象
Sequelize.TimeoutErro: 查詢超時對象
Sequelize.UniqueConstraintError:唯一性錯誤對象
Sequelize.ForeignKeyConstraintError: 違反外鍵約束錯誤對象
Sequelize.ExclusionConstraintError:違反排除約束對象
Sequelize.ConnectionError:連接錯誤對象
Sequelize.ConnectionRefusedError: 一個指向數據庫連接被拒絕時觸發的錯誤對象
Sequelize.AccessDeniedError: 連接到數據庫但沒有訪問權限時會觸發此錯誤。
Sequelize.HostNotFoundError: 連接數據但主機名(IP或URI)未找到時會觸發這個錯誤對象。
Sequelize.InvalidConnectionError:連接到數據庫但其中的任意參數出現錯誤時會觸發這個錯誤對象。
Sequelize.ConnectionTimedOutError:連接數據庫超時時會觸發這個錯誤對象。
Sequelize.InstanceError: 當任何實例方法出現問題時會觸發這個錯誤對象。
作者:一夜風情
鏈接:https://www.jianshu.com/p/af68364e5bdd
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
