نوشتن پرس و جوهای SQL خام می تواند بسیار زیاد باشد. از API ساده و شهودی Sequelize برای تعامل با پایگاه داده PostgreSQL در Node.js استفاده کنید.
Sequelize یک نقشهبردار شی رابطهای Node.js (ORM) است که یک API با کاربری آسان برای پایگاههای داده رابطهای مانند Oracle، PostgreSQL، MySQL، MariaDB، SQLite و غیره ارائه میکند.
PostgreSQL یک سیستم مدیریت پایگاه داده رابطهای منبع باز (RDBMS) پرکاربرد است که به دلیل ویژگیهای گسترده، امنیت عالی و مقیاسپذیری مشهور است.
PostgreSQL با چندین زبان برنامه نویسی از جمله جاوا اسکریپت سازگار است و آن را به گزینه ای ایده آل برای برنامه های تحت وب و داده محور تبدیل می کند. در اینجا یاد خواهید گرفت که با استفاده از Sequelize یک پایگاه داده Postgres در Node.js راه اندازی کنید.
مرحله 1: نصب Dependencies
قبل از اینکه بتوانید از PostgreSQL استفاده کنید، باید آن را روی سیستم خود نصب کنید. برای دانلود PostgreSQL، به وب سایت PostgreSQL بروید و سیستم عامل خود را انتخاب کنید. اگر در طول این فرآیند در macOS با مشکل مواجه شدید، نصب PostgreSQL در macOS را بررسی کنید.
از طرف دیگر، میتوانید با استفاده از پلتفرمهایی مانند ElephantSQL که PostgreSQL را به عنوان یک سرویس ارائه میدهند، از PostgreSQL در فضای ابری استفاده کنید.
در مرحله بعد، sequelize را با اجرای دستور زیر نصب کنید:
npm install sequelize
سپس با اجرای دستور زیر، درایور پایگاه داده PostgreSQL را نصب کنید:
npm install pg pg-hstore
مرحله 2: اتصال به پایگاه داده PostgreSQL
در فهرست منبع پروژه خود، یک پوشه پیکربندی ایجاد کنید. در پوشه config، یک فایل db.js ایجاد کنید. این فایل حاوی تمام کدهایی است که برنامه Node.js شما را به پایگاه داده PostgreSQL متصل می کند.
بعد، در فایل db.js خود، Sequelize را از sequelize وارد کنید.
const { Sequelize } = require("sequelize");
بعد، شما باید یک نمونه Sequelize ایجاد کنید. این نمونه پارامترهای اتصال مانند نام پایگاه داده، نام کاربری و رمز عبور را به عنوان آرگومان می گیرد. از طرف دیگر، یک URI اتصال واحد به عنوان آرگومان می گیرد.
مثلا:
// Connection parameters
const sequelize = new Sequelize('database', 'username', 'password')
// with URI
const sequelize = new Sequelize(process.env.POSTGRESQL_DB_URI)
علاوه بر این، این سازنده یک شی پیکربندی را به عنوان یک آرگومان اختیاری می گیرد.
سپس، اتصال sequelise خود را با افزودن کد زیر فایل db.js خود تست کنید:
const testDbConnection = async () => {
try {
await sequelize.authenticate();
console.log("Connection has been established successfully.");
} catch (error) {
console.error("Unable to connect to the database:", error);
}
};
بلوک کد بالا متد sequelize.authenticate() را فراخوانی می کند تا بررسی کند که آیا اتصال خوب است یا خیر و “اتصال با موفقیت برقرار شد” را چاپ می کند. در صورت وجود آن را تسلیم کنیم. اگر خطای اتصال وجود داشته باشد، “Unable to connect to database:” را همراه با خطا چاپ می کند.
در نهایت، نمونه sequelize و تابع testDbConnection را صادر کنید.
module.exports = { sq: sequelize, testDbConnection };
مرحله 3: ایجاد یک مدل Sequelize
در فهرست منبع پروژه خود، یک پوشه مدل ایجاد کنید. این پوشه شامل تمام مدل های دنباله دار شما خواهد بود. بعد، یک فایل مدل ایجاد کنید. نامی که به فایل میدهید باید اطلاعاتی درباره نمایش مدل ارائه دهد.
در فایل مدل خود، نمونه sequelize را وارد کنید.
// example.js
const { sq } = require("../config/db");
سپس DataTypes را از sequelize وارد کنید.
const { DataTypes } = require("sequelize");
DataTypes به شما امکان می دهد نوع داده مورد نیاز را برای هر ویژگی در مدل خود تنظیم کنید.
شما می توانید با فراخوانی متد define در نمونه sequelize خود، یک مدل sequelize جدید ایجاد کنید که یک جدول را در پایگاه داده خود نشان می دهد.
متد define دو آرگومان می گیرد: نام مدل و یک شیء ویژگی. نام مدل نشان دهنده نام مدل است. شیء ویژگی ها ستون های پایگاه داده را نشان می دهد که هر ویژگی نشان دهنده یک ستون است.
در اینجا نمونه ای از یک مدل دنباله دار آورده شده است:
const User = sq.define("user", {
email: {
type: DataTypes.STRING,
allowNull: false,
primaryKey: true,
},
fullName: {
type: DataTypes.STRING,
},
age: {
type: DataTypes.INTEGER,
},
employed: {
type: DataTypes.BOOLEAN,
defaultValue: false,
},
});
بلوک کد بالا یک مدل کاربر را با ایمیل، نام کامل، سن و ویژگیهای استفاده شده تعریف میکند.
ویژگی ایمیل یک نوع رشته ای است که نمی تواند خالی باشد (allowNull: false) و همچنین به عنوان کلید اصلی جدول User عمل می کند (primaryKey: true). fullName و ویژگی age به ترتیب یک رشته (DataTypes.STRING) و نوع صحیح (DataTypes.INTEGER) هستند. ویژگی employed یک نوع بولی با مقدار پیش فرض false است، به این معنی که اگر مشخص نشده باشد، به طور خودکار در پایگاه داده روی false تنظیم می شود.
در مرحله بعد، روش همگام سازی را در مدل خود فراخوانی کنید. این متد یک شیء پیکربندی را به عنوان آرگومان می گیرد. بسته به گزینه های موجود در شی پیکربندی، روش همگام سازی می تواند:
- User.sync(): در صورت نبود جدول ایجاد کنید و در صورت وجود هیچ کاری انجام نمی دهید.
- User.sync({ force: true }): جدول را ایجاد کنید و اگر قبلاً وجود دارد، اولین جدول را رها کنید.
- User.sync({ alter: true }): وضعیت فعلی جدول را در پایگاه داده بررسی کنید و تغییرات لازم را در جدول انجام دهید تا مطابق با مدل باشد.
مثلا:
User.sync().then(() => {
console.log("User Model synced");
});
بلوک کد بالا جدول پایگاه داده را برای مدل User در صورت وجود نداشتن ایجاد می کند و در صورت وجود هیچ کاری انجام نمی دهد.
در نهایت، مدل خود را صادر کنید:
module.exports = User;
جستجو در پایگاه داده PostgreSQL
Sequelize روش های مختلفی را ارائه می دهد که به شما امکان می دهد بدون نوشتن دستورات SQL خام با پایگاه داده PostgreSQL خود تعامل داشته باشید.
ذخیره داده ها در PostgreSQL
برای ذخیره دادهها در پایگاه داده PostgreSQL، متد create را روی مدل خود فراخوانی کنید و یک شی را که مدل PostgreSQL را پیادهسازی میکند به عنوان آرگومان ارسال کنید.
مثلا:
const mike = User.create({
email: "mike@example.com",
fullName: "Mike Smith",
age: 30,
employed: true,
});
بلوک کد بالا یک نمونه کاربر از مایک در پایگاه داده شما ایجاد می کند و یک شناسه منحصر به فرد را به طور خودکار تولید می کند.
بازیابی داده ها از PostgreSQL
داده ها را می توان به روش های مختلفی از پایگاه داده PostgreSQL با استفاده از sequelize بازیابی کرد، اما این بستگی به ماهیت داده ای دارد که می خواهید دریافت کنید.
متداول ترین روش ها برای بازیابی داده ها متدهای findOne و findAll هستند. findAll تمام نمونههای دادهای را که یک پرسوجو را برآورده میکنند، برمیگرداند، در حالی که findOne اولین نمونهای را که پرس و جو را برآورده میکند، برمیگرداند.
مثلا:
// Find all users
const users = await User.findAll();
کد بالا تمام نمونه های کاربر در پایگاه داده را برمی گرداند.
با استفاده از عبارت Where می توانید داده های برگشتی را فیلتر کنید. این عبارت به شما امکان می دهد شرایط خاصی را به پرس و جو اضافه کنید. درخواست شما فقط نمونه هایی را برمی گرداند که دارای این شرایط باشند.
مثلا:
User.findAll({
where: {
employed: false
}
});
کد بالا تمام نمونه های کاربر را با ویژگی به کار گرفته شده آنها در پایگاه داده به false برمی گرداند.
به روز رسانی داده ها در PostgreSQL
می توانید با فراخوانی متد به روز رسانی و ارسال فیلتر به عنوان آرگومان، داده ها را در پایگاه داده PostgreSQL به روز کنید.
مثلا:
await User.update({ employed: true }, {
where: {
employed: false
}
});
کد بالا تمام نمونه های کاربر را با مقدار استفاده شده از false به true تغییر می دهد.
همچنین، میتوانید با تغییر دستی ویژگیهایی که میخواهید تغییر دهید و فراخوانی روش ذخیره در نمونه، دادهها را بهروزرسانی کنید.
مثلا:
const userMike = await User.findOne({ where: { email: "mike@example.com" } });
if(userMike !== null) {
userMike.email = "mike@example.org"
await userMike.save()
}
کد بالا از پایگاه داده برای کاربری که ایمیل «mike@example.com» را دارد با استفاده از روش findOne درخواست میکند. اگر کاربر پیدا شود، ویژگی ایمیل را دوباره به “mike@example.org” اختصاص می دهد و روش ذخیره را برای به روز رسانی پایگاه داده فراخوانی می کند.
حذف داده ها در PostgreSQL
می توانید با فراخوانی متد تخریب و ارسال فیلتر به عنوان آرگومان، داده های PostgreSQL را حذف کنید.
مثلا:
await User.destroy({
where: {
email: "mike@example.org"
}
});
کد بالا از پایگاه داده برای کاربری که ایمیل “mike@example.org” را دارد درخواست می کند و کاربر را از پایگاه داده حذف می کند.
مزایای استفاده از PostgreSQL با Sequelize
نوشتن پرس و جوهای خام SQL برای تعامل با پایگاه داده PostgreSQL می تواند دردسرساز باشد. با Sequelize، میتوانید به راحتی مدلها را تعریف کنید، بین آنها ارتباط ایجاد کنید و با یک API ساده و شهودی پایگاه داده را جستجو کنید. از طرف دیگر، می توانید از ORM های دیگر مانند TypeORM برای تعامل با پایگاه داده PostgreSQL بدون دردسر نوشتن پرس و جوهای خام SQL استفاده کنید.