在使用資料庫時,您可以選擇使用資料庫提供的基本功能,或使用一個建立在其之上並為您抽象出細節的函式庫。

Sequelize就是其中之一,它是一個非常受歡迎的Node.js封裝器,可用於PostgreSQLMySQL和其他資料庫。

在本文中,我將探討如何使用Sequelize來處理PostgreSQL資料庫。

安裝並設定Sequelize

在內部,Sequelize使用pg函式庫與PostgreSQL建立連接,所以當我們安裝sequelize npm套件時,我們還需要安裝pg

npm install pg sequelize

提示:如果你的專案是全新的且沒有package.json文件,請不要忘記首先執行npm init -y

在您的Node.js文件中,您首先定義資料庫存取變數:

const user = '<postgres用戶名>'
const host = 'localhost'
const database = '<postgres資料庫名>'
const password = '<postgres密碼>'
const port = '<postgres埠號>'

然後從sequelize進行三個物件的導入:

import { Sequelize, Model, DataTypes } from 'sequelize'

然後,您可以使用以下語法初始化一個新的Sequelize物件實例:

const sequelize = new Sequelize(database, user, password, {
 host,
 port,
 dialect: 'postgres',
 logging: false
})

我們告訴Sequelize這是什麼類型的資料庫,可以在dialect屬性中指定(如前所述,它可以處理不只是Postgres)。

我們還禁用了日誌記錄,因為它會記錄所有SQL查詢,這可能會很冗長,且我們實際上並不需要查看它們(除非您正在調試問題)。

如何創建一個Sequelize模型

對於要使用Sequelize操作的每個資料表,您都需要創建一個模型

以下是一個示例,假設我們有一個具有“name”和“age”兩列的dogs資料表。

我們創建一個Dog類,並將其擴展Model基類:

import { Sequelize, Model, DataTypes } from 'sequelize'

const class Dog extends Model {}

然後在類上調用init()靜態方法,描述資料和我們要應用的規則。在此示例中,我們禁用了null

Dog.init({
 name: {
 type: DataTypes.STRING,
 allowNull: false
 },
 age: {
 type: DataTypes.INTEGER,
 allowNull: false
 }
}, {
 sequelize,
 modelName: 'dog',
 timestamps: false
})

我們使用了DataTypes.STRINGDataTypes.INTEGERDataTypes物件包含了我們可以使用的所有類型的參考,它們分別映射到每個特定的資料庫類型。欲了解更多您可以使用的類型,請參閱官方文檔

如何從資料庫中獲取資料

現在我們有了一個模型,如何從資料表中獲取資料呢?

我們可以使用findAll()方法:

Dog.findAll()

調用此方法將返回所有資料列的列表,並將其賦值給一個變數:

const results = await Dog.findAll()

我們使用了await,因為findAll()返回一個Promise。

要限制我們檢索的資料列,可以傳遞一個具有attributes數組的物件:

Dog.findAll({
 attributes: ['age']
})

使用where屬性在查詢中添加WHERE子句。例如,獲取所有年齡為8的狗:

Dog.findAll({
 where: {
 age: 8,
 }
})

或者,獲取所有年齡大於5的狗:

Dog.findAll({
 where: {
 age: {
 [Op.gte]: 5,
 }
 }
})

更多屬性可以讓您執行其他操作,如limitorder

Dog.findAll({
 limit: 10,
 order: [
 ['name', 'DESC']
 ]
})

如何將資料插入資料庫

我們可以調用Dog.create()並傳遞一個物件來在資料庫中創建一個新的資料列:

const name = 'Roger'
const age = 8
const result = await Dog.create({ name, age })

如何更新資料

使用update()方法在資料表中更新值。

在此示例中,我將“Roger”的年齡設置為9:

Post.update({
 age: 9
}, {
 where: {
 name: 'Roger'
 }
})

如果刪除where屬性,將會更新所有資料列:

Post.update({
 age: 10
})