在使用資料庫時,您可以選擇使用資料庫提供的基本功能,或使用一個建立在其之上並為您抽象出細節的函式庫。
Sequelize就是其中之一,它是一個非常受歡迎的Node.js封裝器,可用於PostgreSQL、MySQL和其他資料庫。
在本文中,我將探討如何使用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.STRING和DataTypes.INTEGER。DataTypes物件包含了我們可以使用的所有類型的參考,它們分別映射到每個特定的資料庫類型。欲了解更多您可以使用的類型,請參閱官方文檔。
如何從資料庫中獲取資料
現在我們有了一個模型,如何從資料表中獲取資料呢?
我們可以使用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,
 }
 }
})
更多屬性可以讓您執行其他操作,如limit和order:
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
})