在使用資料庫時,您可以選擇使用資料庫提供的基本功能,或使用一個建立在其之上並為您抽象出細節的函式庫。
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
})