Sequlize詳解(一)

月兒圓發表於2019-04-15

眾所周知,Node的出現賦予了前端開發人員更大的權利,更強的能力。Sequelize就是這個強大能力中的一部分,它是一個ORM,可以將資料庫中的表單資料對映成js物件,讓我們可以通過javascript來方便快捷的運算元據庫。

建立連線

想要使用資料庫,首先需要連線到這個資料庫。

  1. 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',
})
複製程式碼
  1. 建構函式引數:
  • database: 資料庫名稱。
  • username: 用於對資料庫進行身份驗證的使用者名稱。
  • password: 使用者密碼。
  • host: 關聯式資料庫的主機。
  • port: 主機的埠號。
  • dialect: 要連線的資料庫型別。eg: mysql
  • dialectModulePath: 如果已指定,請從此路徑載入方言庫。例如,如果要在連線到pg資料庫時使用pg.js而不是pg,則應在此處指定“pg.js”。
  • storage: 僅供sqlite使用(sqlite是一個輕量級的資料庫)。預設為':memory:'.
  1. 測試連線:.authenticate()完成測試。
sequelize
  .authenticate()
  .then(() => {
    console.log('Success.');
  })
  .catch(err => {
    console.error('Failed', err);
  });
複製程式碼

建立Module

  1. 概念:模型可以理解為資料庫中的表。
  2. 定義:使用define()函式定義。具體實現方式請參照SequeLize.
  3. 在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

  1. 資料查詢:資料查詢後返回的是模型例項.
  • 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的其他內容。

相關文章