眾所周知,Node的出現賦予了前端開發人員更大的權利,更強的能力。Sequelize就是這個強大能力中的一部分,它是一個ORM,可以將資料庫中的表單資料對映成js物件,讓我們可以通過javascript來方便快捷的運算元據庫。
建立連線
想要使用資料庫,首先需要連線到這個資料庫。
- Sequelize將在初始化時設定連線池,所以如果從單個程式連線到資料庫,你最好每個資料庫只建立一個例項。 如果要從多個程式連線到資料庫,則必須為每個程式建立一個例項,但每個例項應具有“最大連線池大小除以例項數”的最大連線池大小。
const Sequlize = require('seqlize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'lcocalhost',
dialect: 'mysql'|'sqlite'|'postgres'|'mssql',
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
storage: 'path/to/database.sqlite',
})
複製程式碼
- 建構函式引數:
- database: 資料庫名稱。
- username: 用於對資料庫進行身份驗證的使用者名稱。
- password: 使用者密碼。
- host: 關聯式資料庫的主機。
- port: 主機的埠號。
- dialect: 要連線的資料庫型別。eg: mysql
- dialectModulePath: 如果已指定,請從此路徑載入方言庫。例如,如果要在連線到pg資料庫時使用pg.js而不是pg,則應在此處指定“pg.js”。
- storage: 僅供sqlite使用(sqlite是一個輕量級的資料庫)。預設為':memory:'.
- 測試連線:.authenticate()完成測試。
sequelize
.authenticate()
.then(() => {
console.log('Success.');
})
.catch(err => {
console.error('Failed', err);
});
複製程式碼
建立Module
- 概念:模型可以理解為資料庫中的表。
- 定義:使用define()函式定義。具體實現方式請參照SequeLize.
- 在sequelize-typescript中,可以使用裝飾器來快速簡單的定義Module。
import {Table, Column, Model, HasMany} from 'sequelize-typescript';
@Table
class Person extends Model<Person> {
@Column
name: string;
@Column
birthday: Date;
@HasMany(() => Hobby)
hobbles: Hobby[];
}
複製程式碼
- Primary Key: 實現方式有兩種--
@Column({primaryKey: true})
||@PrimaryKey @Column(together)
. - timestamps: 時間戳。一個能表示一份資料在某個特定時間之前已經存在的、 完整的、 可驗證的資料,通常是一個字元序列,唯一地標識某一刻的時間。使用數字簽名技術產生的資料, 簽名的物件包括了原始檔案資訊、 簽名引數、 簽名時間等資訊。預設為false。
- @CreatedAt, @UpdatedAt, @DeletedAt:
@CreatedAt
creationDate: Date;
@UpdatedAt
updatedOn: Date;
@DeletedAt
deletionDate: Date;
複製程式碼
- 新增方法:
import {Sequelize} from 'sequelize-typescript';
const sequelize = new Sequelize({
...
modelPaths: [__dirname + '/**/*.model.ts']
});
// or
sequelize.addModels([__dirname + '/**/*.model.ts']);
複製程式碼
使用Module
- 資料查詢:資料查詢後返回的是模型例項.
- find: 查詢資料庫中的一個特定元素。若是查詢不到則返回null
import User from '../module/User';
public async fineUserById( id ) {
const users = await User.find({
where: { id: id}
});
console.log(users); //user 即是查詢到的符合條件的資料
}
複製程式碼
- findOne: 返回符合查詢條件的第一條資料。
- findOrCreate: 若是元素存在,則返回符合查詢條件的元素。若是不存在,則依據查詢條件來建立這樣的元素。
- findAll: 查詢所有符合條件的資料。 以上是幾種常用的查詢資料的方法,具體所有查詢的方法可以參考相關文件
原始SQL語句查詢
使用sequelize中封裝的方法可以完成資料查詢,但是對於一些比較複雜的查詢或者是習慣寫SQL語句的開發人員來說,使用原始的SQL語句來查詢更方便快捷。Sequelize中也支援傳入SQL語句完成查詢。
使用sequelize.query()
函式完成查詢,該函式支援傳入兩個引數。第一個引數是SQL語句的字串,第二個引數傳入一個option物件,進行一些查詢的配置。具體引數配置,可檢視官網
// 使用SQL語句完成聯表查詢
const data = await sequelize.query('SELECT * FROM Student WHERE id in(SELECT studentId FROM Class WHERE id = 1) LIMIT 6');
複製程式碼
使用SQL語句直接進行查詢,當語句中有變數的時候,需要注意安全性問題(SQL隱碼攻擊)。sequezlize也考慮到了這個問題,所以我們通過第二個引數傳入一些變數來替換原始sql語句中的變數,避免SQL隱碼攻擊。
// id是變數
let id = 1;
const data = await sequelize.query(
'SELECT * FROM Student WHERE id in(SELECT studentId FROM Class WHERE id = :id) LIMIT 6', {
replacements: { id: id },
type: sequelize.QueryTypes.SELECT
});
複製程式碼
以上就是Sequelize的基礎使用,在後續的文章中,我會為大家繼續介紹Sequelized的其他內容。