از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
استفاده از PostgreSQL با Node.js و node-postgresدر این مقاله، روش ادغام PostgreSQL با Node.js را مورد بحث قرار خواهیم داد. برای اینکه این مقاله را بهتر دنبال کنید، توصیه می کنیم که تجربه قبلی در استفاده از دستورات Node.js و SQL داشته باشید. ما در این مقاله از نحو ساده جاوا اسکریپت ES6 استفاده خواهیم کرد. چند مشتری مختلف وجود دارد …
سرفصلهای مطلب
معرفی
در این مقاله، روش ادغام PostgreSQL با Node.js را مورد بحث قرار خواهیم داد.
برای اینکه این مقاله را بهتر دنبال کنید، توصیه می کنیم که تجربه قبلی در استفاده از دستورات Node.js و SQL داشته باشید. ما در این مقاله از نحو ساده جاوا اسکریپت ES6 استفاده خواهیم کرد.
چند کلاینت مختلف وجود دارد که می توانید برای ادغام PostgreSQL با Node.js استفاده کنید. در این مقاله، ما از آن استفاده خواهیم کرد node-postgres
مدول. این یک ماژول محبوب و بالغ در مقایسه با سایر مشتریان PostgreSQL است.
همچنین، می توانید از PostgreSQL با یک ORM مانند عاقبت سازی همچنین. اما ما در این مقاله از چنین ماژول ORM استفاده نخواهیم کرد. در عوض، از پرسوجوهای ساده SQL استفاده میکنیم، که میتوانید برای تعاملات پیچیدهتر پایگاهداده از آنها استفاده کنید.
PostgreSQL
PostgreSQL یک پایگاه داده محبوب SQL است. این پایگاه داده در بیش از 30 سال گذشته در حال توسعه بوده است و به عنوان یکی از پیشرفته ترین پایگاه داده های رابطه ای در آنجا در نظر گرفته می شود. یادگیری و راه اندازی PostgreSQL نیز در مقایسه با سایر پایگاه های داده رابطه ای موجود آسان است. به دلیل ماهیت رایگان و منبع باز آن، این یک انتخاب محبوب در بین استارتاپ ها است.
PostgreSQL یک پایگاه داده بین پلتفرمی است که اجرا می شود روی تمام سیستم عامل های اصلی با این حال، پیکربندی و ایجاد دسترسی/پایگاه داده بین سیستم عامل ها کمی متفاوت است.
در این مقاله، ما از اوبونتو 18.04 استفاده خواهیم کرد که یک پلتفرم محبوب لینوکس است و به طور پیشفرض شامل PostgreSQL است. اگر از سیستم عامل دیگری استفاده می کنید، ممکن است برخی از مراحل کمی متفاوت باشند.
پیکربندی پروژه
بیایید با یک پروژه ساده Node.js خالی با تنظیمات پیش فرض شروع کنیم:
$ npm init -y
سپس، بیایید استفاده کنیم npm
برای نصب node-postgres
ماژول، که برای اتصال و تعامل با Postgres استفاده می شود:
$ npm install --save pg
اجرای عملیات CRUD
با بوت استرپ پروژه ما، بیایید پیش برویم و پایگاه داده را پیکربندی کنیم. پس از آن، برخی از عملکردهای اولیه CRUD را می نویسیم.
پیکربندی پایگاه داده
مانند همه پایگاههای داده رابطهای، ما با ایجاد یکی و اتصال به آن شروع میکنیم. برای این کار می توانید از CLI یا یک کلاینت مبتنی بر رابط کاربری گرافیکی استفاده کنید. از آنجایی که راه اندازی از طریق CLI بسیار ساده است، ما دقیقاً این کار را انجام خواهیم داد.
برای اوبونتو، پیش فرض است psql
دستور وارد CLI می شود. PostgreSQL یک کاربر به نام ایجاد می کند postgres
برای دسترسی به پایگاه داده در سیستم عامل های مبتنی بر لینوکس. بنابراین، ما می توانیم از دستور زیر برای ورود به عنوان استفاده کنیم postgres
کاربر:
$ sudo -i -u postgres
سپس با اجرای CLI وارد شوید:
$ psql
شما باید یک پوسته فرمان مشابه این را ببینید:
برای مشاهده پایگاههای اطلاعاتی موجود، از \list
یا \l
دستور:
و اکنون، بیایید با استفاده از یک پرس و جوی SQL خودمان را ایجاد کنیم:
CREATE DATABASE testdb;
با اجرای این دستور، یک a را ایجاد می کنیم testdb
پایگاه داده و با خروجی خوشامد گفت و دستور ما را تأیید کرد:
CREATE DATABASE
از آنجایی که پایگاه داده ایجاد شده است، اکنون می توانیم به آن دسترسی داشته باشیم. در حالی که PostgreSQL یک پیش فرض ایجاد می کند postgres
کاربر، رمز عبور به طور پیش فرض تنظیم نشده است. اگر می خواهید رمز عبور خود را تنظیم کنید (به جای خالی گذاشتن آن)، از آن استفاده کنید \password
دستور:
با تنظیم رمز عبور شما، ما آماده استفاده از پایگاه داده در پروژه خود هستیم.
اتصال به پایگاه داده
شما دو گزینه دارید که می توانید با آن به سرور PostgreSQL متصل شوید node-postgres
مدول. یکی از گزینه ها استفاده از یک کلاینت واحد است. روش دیگر استفاده از استخر اتصال است. با این حال، اگر برنامه شما به طور مکرر از پایگاه داده استفاده می کند، pool گزینه بهتری نسبت به استفاده از یک کلاینت واحد خواهد بود.
اتصال به پایگاه داده با استفاده از node-postgres
ماژول را می توان به دو روش انجام داد – با استفاده از a مشتری تک و با استفاده از a استخر اتصال.
در ادامه این مقاله به روش استفاده از یک استخر اتصال برای اتصال به پایگاه داده نگاهی خواهیم انداخت. در حال حاضر، بیایید برای اختصار و سادگی با استفاده از یک کلاینت به پایگاه داده متصل شویم:
const { Client } = require('pg');
const client = new Client({
user: 'postgres',
host: 'localhost',
database: 'testdb',
password: '1234abcd',
port: 5432,
});
client.connect();
در اینجا، ما به صورت دستی گزینه ها را پیکربندی کرده ایم. با این حال، می توانید بدون عبور از هیچ یک از موارد زیر به پایگاه داده متصل شوید:
const { Client } = require('pg');
const client = new Client();
client.connect();
اما دوباره، Node نیاز دارد دانستن چگونه برای اتصال به پایگاه داده، بنابراین ما آنها را از طریق متغیرهای محیطی عرضه می کنیم:
PGUSER=dbuser
PGHOST=database.server.com
PGPASSWORD=secretpassword
PGDATABASE=mydb
PGPORT=3211
اگر خودتان آنها را پیکربندی نکرده باشید، ماژول از مقادیر پیش فرض استفاده می کند:
PGHOST='localhost'
PGUSER=process.env.USER
PGDATABASE=process.env.USER
PGPASSWORD=null
PGPORT=5432
در لینوکس، process.env.USER
مقدار را برای کاربر فعلی که وارد شده است نگه می دارد.
ایجاد جداول
در حالی که پایگاه داده برای درج داده آماده شده است، بیایید چند جدول برای ذخیره داده های خود ایجاد کنیم. مانند همه پایگاه های داده مبتنی بر SQL، ما از CREATE TABLE
پرس و جو:
CREATE TABLE (table_name) (
(column1) (datatype),
(column2) (datatype),
(column3) (datatype),
....
);
یک جدول شامل ستون هاو هر ستون دارای یک نوع داده است. به عنوان مثال، الف firstName
ستون خواهد داشت varchar
به عنوان نوع داده، که نشان دهنده یک رشته با اندازه متغیر است.
اگر می خواهید درباره انواع داده های پشتیبانی شده بیشتر بخوانید، PostgreSQL Documentation آنها را به خوبی فهرست می کند.
همانطور که گفته شد، می توانیم از این پرس و جو برای ایجاد جدول در پایگاه داده استفاده کنیم:
const query = `
CREATE TABLE users (
email varchar,
firstName varchar,
lastName varchar,
age int
);
`;
برای اجرای واقعی این پرس و جو در مقابل پایگاه داده، از عبارت استفاده می کنیم query()
تابع از client
شیئی که قبلاً تنظیم کردیم:
client.query(query, (err, res) => {
if (err) {
console.error(err);
return;
}
console.log('Table is successfully created');
client.end();
});
توجه داشته باشید: فراموش نکنید end()
پس از اجرای پرس و جو با مشتری ارتباط برقرار کنید.
با اجرای این کد، جدول ما و print بیرون:
Table is successfully created
این نیز با استفاده از وعده و async/await
. از آنجایی که یک فراخوانی پایگاه داده ممکن است شکست بخورد، استفاده از وعدهها منطقیتر است:
client
.query(query)
.then(res => {
console.log('Table is successfully created');
})
.catch(err => {
console.error(err);
})
.finally(() => {
client.end();
});
همانطور که در مثال مشاهده می کنید می توانیم از بلوک final برای بستن ارتباط با پایگاه داده استفاده کنیم. بنابراین حتی اگر پرس و جو پرتاب یک err
، ارتباط قطع خواهد شد.
به طور متناوب، می توانیم از آن استفاده کنیم async/await
نحو نیز:
try {
const res = await client.query(query);
console.log('Table is successfully created');
} catch (err) {
console.log(err.stack);
} finally {
client.close();
}
همه این رویکردها باید نتیجه یکسانی داشته باشند:
Table is successfully created
برای تأیید این موضوع، از psql
رابط خط فرمان برای بازرسی DB. a را باز کنید terminal، پوسته را با psql
و پایگاه داده را با استفاده از \c (database)
فرمان \c
مختصر است برای \connect
:
\c testdb
سپس می توانید جدول های موجود در پایگاه داده را فهرست کنید testdb
با اجرای \dt
دستور:
شما همچنین می توانید برای جداول خاص با ارائه نام آنها پرس و جو کنید:
testdb=# \dt FOO
این کوئری جدولی را با نام نمایش می دهد FOO
.
ایجاد/درج داده
ما می توانیم از SQL استفاده کنیم INSERT INTO
عبارت برای درج داده ها در جدول:
INSERT INTO (table_name) ((column1), (column2), (column3), ...)
VALUES ((value1), (value2), (value3), ...);
برای مشخص کردن این پرس و جو، بیایید مقادیر خود را وارد کرده و یک پرس و جو بسازیم:
const query = `
INSERT INTO users (email, firstName, lastName, age)
VALUES ('(email protected)', 'john', 'doe', 21)
`;
و در نهایت، اجازه دهید کوئری را در مقابل پایگاه داده اجرا کنیم:
client.query(query, (err, res) => {
if (err) {
console.error(err);
return;
}
console.log('Data insert successful');
client.end();
});
توجه داشته باشید: مانند دفعه قبل، این تابع را می توان با استفاده از async/await
نحو. این مثال های اضافی برای اختصار حذف شده اند.
اجرای این کد یک کاربر را به پایگاه داده ما وارد می کند و print بیرون:
Data insert successful
برای تأیید این موضوع، در ما testdb
پایگاه داده را اجرا کنید SELECT
بیانیه:
SELECT * from users;
ما به وضوح می بینیم که کاربر واقعاً با موفقیت ایجاد شده است:
بازیابی/انتخاب داده ها
برای بازیابی داده ها از پایگاه داده، SELECT
بیانیه استفاده می شود:
SELECT (column1), (column2), ...
FROM (table_name)
WHERE (condition);
میتوانید ستونهای خاصی را با مشخص کردن آنها انتخاب کنید یا تمام فیلدهای یک جدول را با استفاده از عبارت انتخاب کنید *
عام به صورت اختیاری، می توانید با استفاده از شرطی های بیشتر خلاق شوید WHERE
بیانیه.
در اینجا همه سطرها و تمام ستون ها را از قسمت انتخاب می کنیم users
پایگاه داده:
const query = `
SELECT *
FROM users
`;
اکنون، برای اجرای این کوئری در مقابل پایگاه داده، از عبارت استفاده می کنیم client
از نو:
client.query(query, (err, res) => {
if (err) {
console.error(err);
return;
}
for (let row of res.rows) {
console.log(row);
}
client.end();
});
با اجرای این کد به دست می آید:
{
email: '(email protected)',
firstname: 'john',
lastname: 'doe',
age: 21
}
{
email: '(email protected)',
firstname: 'anna',
lastname: 'dias',
age: 35
}
این پرس و جو برمی گردد همه کاربران به پایگاه داده اضافه شدند. همچنین می توانید کاربران را بر اساس فیلدهای آنها فیلتر کنید.
برای مثال، اگر بخواهیم همه کاربران کمتر از 30 سال را برگردانیم، یک علامت را اضافه می کنیم WHERE
عبارت:
const query = `
SELECT *
FROM users
WHERE age<30
`;
و سپس، آن را در مقابل پایگاه داده اجرا می کنیم:
client.query(query, (err, res) => {
if (err) {
console.error(err);
return;
}
for (let row of res.rows) {
console.log(row);
}
client.end();
});
با اجرای این کد به دست می آید:
{
email: '(email protected)',
firstname: 'john',
lastname: 'doe',
age: 21
}
به روز رسانی داده ها
برای به روز رسانی داده هایی که از قبل وجود دارد، می توانیم از UPDATE
بیانیه:
UPDATE (table_name)
SET (column1) = (value1), (column2) = (value2), ...
WHERE (condition);
می توانید هر مقدار به روز شده را برای هر ستون با SET
کلمه کلیدی. بعد از WHERE
بند، شما می توانید شرایطی را تعریف کنید که کدام ورودی ها باید به روز شوند.
بیایید پرس و جو خود را پر کنیم:
const query = `
UPDATE users
SET age = 22
WHERE email = '(email protected)'
`;
حالا بیایید کوئری را در مقابل پایگاه داده اجرا کنیم:
client.query(query, (err, res) => {
if (err) {
console.error(err);
return;
}
if (err) {
console.error(err);
return;
}
console.log('Data update successful');
client.end();
});
اجرای این قطعه کد، ورودی هایی را که رضایت شما را برآورده می کنند، به روز می کند WHERE
بند و print بیرون:
Data update successful
برای تأیید، بیایید پایگاه داده خود را بررسی کنیم:
حذف داده ها
در نهایت برای حذف داده ها می توانیم از DELETE
بیانیه:
DELETE FROM (table_name)
WHERE (condition);
مراقب این عبارت باشید زیرا ممکن است به طور تصادفی بیش از آنچه قصد دارید حذف کنید.
بیایید پرس و جو خود را پر کنیم:
const query = `
DELETE FROM users
WHERE email = '(email protected)'
`;
و در نهایت، آن را در مقابل پایگاه داده اجرا کنید:
client.query(query, (err, res) => {
if (err) {
console.error(err);
return;
}
if (err) {
console.error(err);
return;
}
console.log('Data delete successful');
client.end();
});
اجرای این کد ورودی راضی کننده را حذف می کند WHERE
بند و print بیرون:
Data delete successful
برای تأیید، بیایید نگاهی به پایگاه داده بیندازیم:
ادغام
اگر برنامه شما به طور مکرر از پایگاه داده استفاده می کند، استفاده از یک اتصال کلاینت به پایگاه داده احتمالاً زمانی که درخواست های کاربر زیادی دارید، برنامه را کند می کند. ساده ترین و راحت ترین راه برای رفع این مشکل استفاده از یک استخر اتصال است.
معمولاً وقتی یک کلاینت جدید به پایگاه داده متصل می شود process برقراری ارتباط و احراز هویت حدود 20 تا 30 میلی ثانیه طول می کشد. زمانی که درخواستهای بیشتری را اجرا میکنید که منجر به تأخیر چند ثانیهای میشود، بسیار مهم است، که احتمالاً به یک تجربه کاربر نهایی رضایتبخش تبدیل میشود.
همچنین، سرور PostgreSQL تنها می تواند تعداد محدودی از مشتریان را در یک زمان معین مدیریت کند که بستگی به آن دارد روی حافظه سرور شما بنابراین اگر 100 پرس و جو در حال انجام است روی در یک ثانیه – این محدودیت ممکن است سرور شما را خراب کند.
علاوه بر این، مشتری می تواند process فقط یک درخواست در یک زمان برای یک اتصال واحد که سرعت کار را بیشتر کند.
در چنین شرایطی می توانید از pg-pool
ماژول برای حل آن
ایجاد یک استخر
اولین import را Pool
کلاس از pg
مدول:
const { Pool } = require('pg');
سپس، بیایید یک شی pool جدید ایجاد کنیم:
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'testdb',
password: '1234abcd',
port: 5432,
});
اگر نام کاربری را پیکربندی نکنید، hostو سایر خصوصیات، شما باید متغیرهای محیطی را برای آنها در یک فایل پیکربندی تعریف کنید. تقریباً مشابه هنگام پیکربندی یک کلاینت است.
بعد، اجازه دهید یک کنترل کننده خطا برای استخر تعریف کنیم. اگر خطایی در پرتاب از استخر وجود داشته باشد، پاسخ تماس در این رویداد اجرا می شود:
pool.روی('error', (err, client) => {
console.error('Error:', err);
});
این ما را در صورت بروز خطای شبکه پوشش می دهد.
سپس با استفاده از pool
شی، به پایگاه داده متصل می شویم و از a استفاده می کنیم client
در آن استخر برای اجرای یک پرس و جو:
const query = `
SELECT *
FROM users
`;
pool.connect((err, client, done) => {
if (err) throw err;
client.query(query, (err, res) => {
done();
if (err) {
console.log(err.stack);
} else {
for (let row of res.rows) {
console.log(row);
}
}
});
});
این باید نتیجه دهد:
{
email: '(email protected)',
firstname: 'john',
lastname: 'doe',
age: 21
}
{
email: '(email protected)',
firstname: 'anna',
lastname: 'dias',
age: 35
}
باز هم، استفاده از وعده ها در این مورد منطقی تر است:
pool.connect()
.then((client) => {
client.query(query)
.then(res => {
for (let row of res.rows) {
console.log(row);
}
})
.catch(err => {
console.error(err);
});
})
.catch(err => {
console.error(err);
});
یا حتی async/await
نحو:
(async () => {
try {
const client = await pool.connect();
const res = await client.query(query);
for (let row of res.rows) {
console.log(row);
}
} catch (err) {
console.error(err);
}
})();
استفاده از مکان نما برای خواندن پرس و جوهای بزرگ
معمولاً داده های دریافتی از یک پرس و جو مستقیماً در حافظه بارگذاری می شوند. هرچه مجموعه داده بزرگتر باشد، میزان استفاده از حافظه بیشتر خواهد بود.
بنابراین وقتی میخواهید از مجموعه دادههای بزرگی که ممکن است شامل هزاران رکورد باشد، پرس و جو کنید – بارگذاری همه آن در حافظه بسیار ناکارآمد است و اغلب اوقات، غیرممکن است. یک مکان نما می تواند با بازیابی تعداد محدودی رکورد در یک زمان به شما در موقعیتی مانند این کمک کند.
به یک معنا، استفاده از مکان نما شبیه به جریان داده است زیرا به صورت متوالی در بلوک های کوچکتر به آن دسترسی خواهید داشت. برای استفاده از مکان نما، باید آن را نصب کنیم pg-cursor
ماژول اول:
$ npm install --save pg pg-cursor
ما عبور خواهیم کرد new Cursor
به query()
تابع. این cursor
در واقع هیچ اطلاعاتی را بازیابی نمی کند تا زمانی که محدودیت را با استفاده از آن مشخص کنیم read()
روش:
const { Pool } = require('pg');
const Cursor = require('pg-cursor');
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'testdb',
password: '1234abcd',
port: 5432,
});
(async () => {
const client = await pool.connect();
const query = 'SELECT * FROM users';
const cursor = await client.query(new Cursor(query));
cursor.read(1, (err, rows) => {
console.log('We got the first row set');
console.log(rows);
cursor.read(1, (err, rows) => {
console.log('This is the next row set');
console.log(rows);
});
});
})();
این cursor
‘s read()
متد به ما اجازه می دهد تا تعیین کنیم که چند ردیف از جریان فعلی بازیابی کنیم cursor
نمونه، مثال. در این مثال برای سادگی، ردیف ها را برای یک رکورد محدود کرده ایم. سپس مجموعه دیگری از ردیف ها را بعد از آن خوانده ایم.
اگر به انتهای سطرها در پایگاه داده رسیده اید، rows
آرایه طولی خواهد داشت 0
.
نتیجه
PostgreSQL یک پایگاه داده رابطه ای واقعاً محبوب، رایگان و منبع باز است. این node-postgres
ماژول یک ماژول پرکاربرد و بالغ است که Node.js را به PostgreSQL پیوند می دهد.
در این مقاله، ما یک پایگاه داده PostgreSQL را راهاندازی کردهایم و عملکرد اولیه CRUD را از طریق یک اسکریپت ساده Node.js توسعه دادهایم. سپس، ما پشتیبانی از ادغام و استفاده از نشانگرها برای محدود کردن داده های بازیابی شده را بررسی کرده ایم.
مثل همیشه کد منبع موجود است روی GitHub.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-21 13:07:03