الاتصال بـ PostgreSQL وMySQL
استخدم مشغّلَي RPostgres وRMySQL للاتصال بقواعد البيانات المستندة إلى الخادم.
الاتصال بـ PostgreSQL وMySQL درس مجاني في R Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
اتصالات قواعد البيانات في بيئة الإنتاج
على الرغم من أن RSQLite مناسب جدًا للتطوير والاختبار، فإن بيانات الإنتاج توجد في PostgreSQL أو MySQL أو SQL Server أو قواعد البيانات السحابية. وتبقى واجهة DBI كما هي، ولا يتغير سوى حزمة برنامج التشغيل ووسائط الاتصال. وهذه هي نقطة القوة الأساسية في DBI.
library(DBI)
# Driver packages for each database:
# PostgreSQL -> RPostgres::Postgres()
# MySQL -> RMySQL::MySQL() or RMariaDB::MariaDB()
# SQL Server -> odbc::odbc()
# BigQuery -> bigrquery::bigquery()
# Redshift -> RPostgres::Postgres() (same protocol)
# DuckDB -> duckdb::duckdb()
# All use the same DBI functions:
# dbConnect, dbGetQuery, dbExecute, dbDisconnectالاتصال بـ PostgreSQL
يُعد RPostgres::Postgres() برنامج التشغيل الخاص بـ PostgreSQL. مرروا معلمات الاتصال: host وport (القيمة الافتراضية 5432) وdbname وuser وpassword. لا تضعوا بيانات الاعتماد مباشرة في الكود، بل استخدموا متغيرات البيئة.
library(DBI)
# library(RPostgres) # Uncomment when available
# PostgreSQL connection pattern:
# con <- dbConnect(
# RPostgres::Postgres(),
# host = 'db.example.com',
# port = 5432,
# dbname = 'analytics',
# user = 'analyst',
# password = 'secretpassword'
# )
# Query exactly like SQLite:
# result <- dbGetQuery(con, 'SELECT * FROM sales LIMIT 5')
# dbDisconnect(con)
cat('PostgreSQL uses the same DBI interface as SQLite!')استخدام متغيرات البيئة لبيانات الاعتماد
يُعد تضمين كلمات المرور مباشرة في الكود خطرًا أمنيًا. خزّنوا بيانات الاعتماد في متغيرات البيئة واقرؤوها باستخدام Sys.getenv(). وفي بيئة الإنتاج، اضبطوا هذه المتغيرات في .Renviron أو ملفات .env (التي لا ينبغي إيداعها في git) أو عبر أنظمة إدارة الأسرار.
library(DBI)
# Set environment variables (normally done outside R):
# In .Renviron file:
# DB_HOST=db.example.com
# DB_NAME=analytics
# DB_USER=analyst
# DB_PASS=secretpassword
# Read credentials from environment
get_pg_connection <- function() {
dbConnect(
RPostgres::Postgres(), # driver
host = Sys.getenv('DB_HOST'),
port = as.integer(Sys.getenv('DB_PORT', '5432')),
dbname = Sys.getenv('DB_NAME'),
user = Sys.getenv('DB_USER'),
password = Sys.getenv('DB_PASS')
)
}
cat('Sys.getenv() reads environment variables safely.')
cat('\nDB_HOST value:', nchar(Sys.getenv('DB_HOST')), 'chars')الاتصال بـ MySQL / MariaDB
تستخدم اتصالات MySQL RMariaDB::MariaDB() (برنامج تشغيل MySQL الحديث) أو RMySQL::MySQL(). وتشبه وسائط الاتصال تلك الخاصة بـ PostgreSQL. ويُوصى باستخدام برنامج تشغيل MariaDB مع خوادم MySQL وMariaDB على حد سواء.
library(DBI)
# MySQL / MariaDB connection pattern:
# library(RMariaDB)
# con <- dbConnect(
# RMariaDB::MariaDB(),
# host = Sys.getenv('MYSQL_HOST'),
# port = 3306,
# dbname = Sys.getenv('MYSQL_DB'),
# user = Sys.getenv('MYSQL_USER'),
# password = Sys.getenv('MYSQL_PASS')
# )
# SSL connection:
# con <- dbConnect(
# RMariaDB::MariaDB(),
# host = 'secure-db.example.com',
# ssl.ca = '/path/to/ca-cert.pem'
# )
cat('RMariaDB supports both MySQL and MariaDB servers.')مهلة الاتصال وإعادة الاتصال
قد تواجه البرامج النصية طويلة التشغيل مهلات في الاتصال. تحققوا من استمرار صلاحية الاتصال باستخدام dbIsValid(con). وبالنسبة إلى البرامج النصية الخاصة بعمليات ETL، فكروا في إعادة الاتصال عند بدء كل دفعة معالجة بدلًا من إبقاء اتصال واحد مفتوحًا لساعات.
library(DBI)
library(RSQLite)
# Safe function with reconnection
query_with_check <- function(con, sql) {
if (!dbIsValid(con)) {
stop('Connection is no longer valid. Reconnect.')
}
dbGetQuery(con, sql)
}
# Demonstrate with SQLite
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 't', data.frame(x=1:3))
cat('Connection valid:', dbIsValid(con), '\n')
print(query_with_check(con, 'SELECT * FROM t'))
dbDisconnect(con)
cat('After disconnect, valid:', dbIsValid(con))مفهوم تجميع الاتصالات
يُعد فتح اتصال جديد بقاعدة البيانات لكل استعلام مكلفًا. يحافظ تجميع الاتصالات على مجموعة من الاتصالات المفتوحة ويعيد استخدامها. وهذا أمر بالغ الأهمية لواجهات الويب وتطبيقات Shiny التي تستقبل طلبات كثيرة في الثانية.
# The 'pool' package provides connection pooling for R
# library(pool)
# Create a pool (connections managed automatically)
# my_pool <- pool::dbPool(
# drv = RPostgres::Postgres(),
# dbname = Sys.getenv('DB_NAME'),
# host = Sys.getenv('DB_HOST'),
# user = Sys.getenv('DB_USER'),
# password = Sys.getenv('DB_PASS'),
# minSize = 2, # Always keep 2 connections ready
# maxSize = 10 # Maximum 10 simultaneous connections
# )
# Use the pool like a regular connection:
# result <- dbGetQuery(my_pool, 'SELECT * FROM table')
# Close the pool on shutdown:
# pool::poolClose(my_pool)
cat('pool package: connection reuse for high-traffic apps!')الاستعلام باستخدام معلمات SQL (بأمان)
لا تدمجوا أبدًا مدخلات المستخدم في سلاسل SQL مباشرةً، بسبب خطر حقن SQL. استخدموا الاستعلامات ذات المعلمات مع sqlInterpolate(con, sql, .dots=list(...)) أو glue_sql() من حزمة glue لإدراج القيم بأمان.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'students',
data.frame(id=1:4, name=c('Alice','Bob','Carol','Dave'), score=c(85,92,78,88)))
# UNSAFE (SQL injection possible):
# name_input <- 'Alice' # imagine user-provided
# dbGetQuery(con, paste('SELECT * FROM students WHERE name =', name_input))
# SAFE: use sqlInterpolate
name_input <- 'Alice'
safe_sql <- sqlInterpolate(con,
'SELECT * FROM students WHERE name = ?name',
name = name_input
)
print(dbGetQuery(con, safe_sql))
dbDisconnect(con)نفق SSH لقواعد البيانات البعيدة
لا يمكن الوصول مباشرةً إلى العديد من قواعد بيانات الإنتاج من الإنترنت. ومن الأنماط الشائعة استخدام نفق SSH: إعادة توجيه منفذ محلي إلى منفذ قاعدة البيانات البعيدة عبر SSH، ثم توصيل R بالعنوان localhost:local_port.
# SSH tunnel setup (run in terminal before connecting from R):
# ssh -N -L 5433:db-server.internal:5432 user@jump-host.example.com
# Then connect in R as if the DB is local:
# con <- dbConnect(
# RPostgres::Postgres(),
# host = 'localhost',
# port = 5433, # Local forwarded port
# dbname = 'analytics',
# user = Sys.getenv('DB_USER'),
# password = Sys.getenv('DB_PASS')
# )
# You can also script the tunnel with:
# system('ssh -fN -L 5433:db:5432 user@jump-host')
cat('SSH tunneling makes private databases accessible to R.')قراءة الجداول الكبيرة على دفعات
عندما يحتوي جدول قاعدة البيانات على ملايين الصفوف، قد يؤدي تحميلها كلها مرة واحدة إلى استنفاد الذاكرة. استخدموا LIMIT/OFFSET أو الجلب القائم على المؤشر لمعالجة الجدول على دفعات. وادمجوا ذلك مع dbFetch() لبث النتائج.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'big_table', data.frame(id=1:100, value=rnorm(100)))
# Process in chunks of 25 rows
chunk_size <- 25
offset <- 0
total_processed <- 0
repeat {
chunk <- dbGetQuery(con, sprintf(
'SELECT * FROM big_table LIMIT %d OFFSET %d',
chunk_size, offset
))
if (nrow(chunk) == 0) break
total_processed <- total_processed + nrow(chunk)
offset <- offset + chunk_size
}
cat('Total rows processed:', total_processed, '\n')
dbDisconnect(con)dbGetInfo() — البيانات الوصفية للاتصال
تُرجع dbGetInfo(con) البيانات الوصفية للاتصال، مثل إصدار الخادم واسم قاعدة البيانات والمستخدم وغير ذلك. ويفيد ذلك في التسجيل والتشخيص والتحقق من الاتصال بمثيل قاعدة البيانات الصحيح في البرامج النصية التي تعمل مع بيئات متعددة.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
info <- dbGetInfo(con)
print(info)
# For PostgreSQL, info would include:
# $host, $port, $dbname, $username, $server.version
dbDisconnect(con)مقارنة استخدام SQLite وPostgreSQL
اختَر SQLite لإنشاء النماذج الأولية والبيانات المضمّنة والاختبار؛ واختَر PostgreSQL لبيئات الإنتاج والوصول من عدة مستخدمين وميزات SQL المتقدمة. تكاد تكون شيفرة DBI متطابقة — والاختلاف الوحيد هو برنامج التشغيل ومعلمات الاتصال.
library(DBI)
library(RSQLite)
# SQLite (development/testing)
con_dev <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con_dev, 'data', mtcars)
dev_result <- dbGetQuery(con_dev, 'SELECT COUNT(*) n FROM data')
cat('SQLite dev DB rows:', dev_result$n, '\n')
dbDisconnect(con_dev)
# PostgreSQL (production) — same interface:
# con_prod <- dbConnect(RPostgres::Postgres(),
# host=Sys.getenv('PG_HOST'), dbname=Sys.getenv('PG_DB'),
# user=Sys.getenv('PG_USER'), password=Sys.getenv('PG_PASS'))
# prod_result <- dbGetQuery(con_prod, 'SELECT COUNT(*) n FROM data')
# dbDisconnect(con_prod)
cat('Same DBI code works for both!')تحقّق سريعًا
ما الطريقة الموصى بها لتوفير بيانات اعتماد قاعدة البيانات في نص R؟
مراجعة: اتصالات PostgreSQL وMySQL
أهم النقاط المتعلقة باتصالات قواعد البيانات في بيئة الإنتاج:
- برنامج تشغيل PostgreSQL:
RPostgres::Postgres()مع وسيطات host وport وdbname وuser وpassword - برنامج تشغيل MySQL/MariaDB:
RMariaDB::MariaDB()مع وسيطات مماثلة - استخدم دائمًا
Sys.getenv('VAR')لبيانات الاعتماد — ولا تكتبها مباشرة في الشيفرة مطلقًا - تتحقق
dbIsValid(con)من أن الاتصال لا يزال فعّالًا - تدير حزمة
poolتجمعات الاتصالات للتطبيقات ذات عدد الزيارات المرتفع - تمنع
sqlInterpolate()حقن SQL عند استخدام قيم يقدّمها المستخدم - نفق SSH: إعادة توجيه منفذ محلي للوصول إلى قواعد البيانات الخاصة
- تعمل جميع دوال DBI بالطريقة نفسها عبر الواجهات الخلفية المختلفة
library(DBI)
library(RSQLite)
# Production-ready connection pattern (SQLite for demo)
open_connection <- function() {
con <- dbConnect(RSQLite::SQLite(), ':memory:')
if (!dbIsValid(con)) stop('Failed to connect')
cat('Connected successfully\n')
con
}
run_query <- function(con, sql) {
if (!dbIsValid(con)) stop('Connection lost')
dbGetQuery(con, sql)
}
con <- open_connection()
dbWriteTable(con, 't', data.frame(x=1:3, y=4:6))
print(run_query(con, 'SELECT * FROM t'))
dbDisconnect(con)الأسئلة الشائعة
هل درس «الاتصال بـ PostgreSQL وMySQL» مجاني؟
نعم — نص درس «الاتصال بـ PostgreSQL وMySQL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «الاتصال بـ PostgreSQL وMySQL»؟
استخدم مشغّلَي RPostgres وRMySQL للاتصال بقواعد البيانات المستندة إلى الخادم. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الاتصال بـ PostgreSQL وMySQL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات DBI وRSQLite
- الاتصال بـ PostgreSQL وMySQL
- dbplyr: SQL عبر صيغة dplyr
- الاستعلامات ذات المعاملات والمعاملات الذرّية