أساسيات DBI وRSQLite
اتصل بقواعد بيانات SQLite ونفّذ الاستعلامات واسترجع النتائج باستخدام DBI.
أساسيات DBI وRSQLite درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
الوصول إلى قواعد البيانات في R باستخدام DBI
توفر حزمة DBI واجهة موحدة للوصول إلى قواعد البيانات في R. وتعمل الدوال نفسها مع مختلف محركات قواعد البيانات (SQLite وPostgreSQL وMySQL وغيرها) من خلال دمج DBI مع حزمة برنامج تشغيل خاصة بالمحرك. وتُعد RSQLite المحرك الأسهل استخدامًا، إذ لا تتطلب تثبيت خادم.
library(DBI)
library(RSQLite)
# DBI + RSQLite: connect to an in-memory SQLite database
# ':memory:' creates a fresh database in RAM
con <- dbConnect(RSQLite::SQLite(), ':memory:')
cat('Connection class:', class(con), '\n')
cat('Database backend:', dbGetInfo(con)$dbname, '\n')
# Always close connection when done
dbDisconnect(con)
cat('Connection closed.')dbConnect() — إنشاء اتصال
تنشئ dbConnect(drv, ...) اتصالًا بقاعدة بيانات. الوسيطة الأولى هي كائن برنامج التشغيل. بالنسبة إلى SQLite، استخدموا RSQLite::SQLite(). وتعتمد الوسائط الإضافية (مثل مسار ملف قاعدة البيانات) على المحرك.
library(DBI)
library(RSQLite)
# In-memory database (disappears when connection closes)
con_mem <- dbConnect(RSQLite::SQLite(), ':memory:')
# File-based SQLite database (persists to disk)
# con_file <- dbConnect(RSQLite::SQLite(), '/tmp/mydb.sqlite')
# Always wrap connections in tryCatch or use on.exit()
on.exit(dbDisconnect(con_mem))
cat('Connected! Is valid:', dbIsValid(con_mem))dbWriteTable() — تحميل البيانات إلى قاعدة البيانات
تنشئ dbWriteTable(con, 'table_name', df) جدولًا وتحمل إطار البيانات إليه. اضبطوا overwrite=TRUE لاستبدال جدول موجود، أو append=TRUE لإضافة صفوف إلى جدول موجود.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
# Load a data frame into the database
students <- data.frame(
id = 1:5,
name = c('Alice','Bob','Carol','Dave','Eve'),
score = c(85, 92, 78, 88, 95)
)
dbWriteTable(con, 'students', students)
# Verify: list tables
cat('Tables in DB:', dbListTables(con), '\n')
dbDisconnect(con)dbListTables() وdbListFields()
تُرجع dbListTables(con) أسماء جميع الجداول في قاعدة البيانات المتصلة. وتُرجع dbListFields(con, 'table') أسماء أعمدة جدول محدد. استخدموا هاتين الدالتين لاستكشاف قاعدة بيانات غير معروفة.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'students', data.frame(id=1:3, name=c('A','B','C'), score=c(80,90,85)))
dbWriteTable(con, 'courses', data.frame(code=c('R101','R201'), title=c('Intro','Advanced')))
cat('Tables:', paste(dbListTables(con), collapse=', '), '\n')
cat('Students fields:', paste(dbListFields(con, 'students'), collapse=', '), '\n')
dbDisconnect(con)dbGetQuery() — تنفيذ SQL وإرجاع البيانات
تنفذ dbGetQuery(con, sql) استعلام SELECT وتُرجع النتيجة في صورة إطار بيانات. وهذه هي الدالة الأساسية لقراءة البيانات من قاعدة بيانات. فهي تجمع dbSendQuery() وdbFetch() وdbClearResult() في خطوة واحدة.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'students',
data.frame(id=1:5, name=c('Alice','Bob','Carol','Dave','Eve'),
score=c(85,92,78,88,95)))
# Run SQL and get results as data frame
high_scorers <- dbGetQuery(con,
'SELECT name, score FROM students WHERE score >= 88 ORDER BY score DESC'
)
print(high_scorers)
dbDisconnect(con)dbFetch() — استرداد النتائج على دفعات
بالنسبة إلى مجموعات النتائج الكبيرة، استخدموا النهج المؤلف من ثلاث خطوات: ترسل dbSendQuery() الاستعلام، وتسترد dbFetch(con, n=1000) دفعات تتكون كل منها من n صفوف، بينما تنظف dbClearResult() الموارد. ويساعد ذلك على التحكم في استهلاك الذاكرة عند التعامل مع الجداول الكبيرة.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
dbWriteTable(con, 'data', data.frame(x=1:100, y=rnorm(100)))
# Three-step approach for chunked reading
rs <- dbSendQuery(con, 'SELECT * FROM data WHERE x <= 5')
chunk <- dbFetch(rs, n=3) # Get first 3 rows
cat('Rows fetched so far:', nrow(chunk), '\n')
print(chunk)
dbClearResult(rs) # Always clear!
dbDisconnect(con)dbExecute() — تنفيذ SQL غير خاص بـ SELECT
تنفذ dbExecute(con, sql) تعليمات SQL التي تعدّل البيانات (INSERT وUPDATE وDELETE وCREATE وDROP)، وتُرجع عدد الصفوف المتأثرة. استخدموها لعمليات DDL وDML التي لا تُرجع صفوفًا.
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)))
# Update a record
rows_affected <- dbExecute(con,
'UPDATE students SET score = 95 WHERE name = \'Alice\''
)
cat('Rows updated:', rows_affected, '\n')
# Verify
print(dbGetQuery(con, 'SELECT * FROM students WHERE name = \'Alice\''))
dbDisconnect(con)dbExistsTable() وdbRemoveTable()
تتحقق dbExistsTable(con, 'name') من وجود جدول (وتُرجع TRUE/FALSE). وتحذف dbRemoveTable(con, 'name') جدولًا. وتفيد هاتان الدالتان في إعداد البرامج النصية وإنهائها بأمان عند احتمال تشغيلها عدة مرات.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
cat('Before: exists?', dbExistsTable(con, 'results'), '\n')
dbWriteTable(con, 'results', data.frame(x=1:3, y=4:6))
cat('After write: exists?', dbExistsTable(con, 'results'), '\n')
dbRemoveTable(con, 'results')
cat('After remove: exists?', dbExistsTable(con, 'results'), '\n')
dbDisconnect(con)dbDisconnect() — إغلاق الاتصالات
أغلقوا دائمًا اتصالات قاعدة البيانات باستخدام dbDisconnect(con) عند الانتهاء. تستهلك الاتصالات المفتوحة الذاكرة ومقابض الملفات. استخدموا on.exit(dbDisconnect(con)) داخل الدوال لضمان تنظيف الموارد حتى عند حدوث خطأ.
library(DBI)
library(RSQLite)
# Safe connection pattern using on.exit()
safe_query <- function(query) {
con <- dbConnect(RSQLite::SQLite(), ':memory:')
on.exit(dbDisconnect(con)) # Runs even if error!
dbWriteTable(con, 'data', data.frame(x=1:5, y=6:10))
dbGetQuery(con, query)
}
result <- safe_query('SELECT * FROM data WHERE x > 3')
print(result)تحميل mtcars إلى SQLite
في مثال عملي، حمّلوا مجموعة البيانات المضمنة mtcars إلى SQLite، ثم نفذوا استعلامات SQL عليها. يوضح ذلك سير عمل DBI كاملًا، ويتيح لكم التدرب على SQL من داخل R.
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
# Load mtcars into the database
dbWriteTable(con, 'cars', mtcars, overwrite=TRUE)
# SQL query
result <- dbGetQuery(con, '
SELECT cyl,
COUNT(*) AS n,
ROUND(AVG(mpg), 1) AS avg_mpg,
ROUND(AVG(hp), 0) AS avg_hp
FROM cars
GROUP BY cyl
ORDER BY cyl
')
print(result)
dbDisconnect(con)ملخص سير عمل DBI
يتبع سير عمل DBI نمطًا ثابتًا بغض النظر عن محرك قاعدة البيانات: الاتصال ← التحميل/الاستعلام ← قطع الاتصال. ويعمل الكود نفسه مع SQLite وPostgreSQL وMySQL وغيرها من خلال تبديل برنامج التشغيل في dbConnect().
library(DBI)
library(RSQLite)
# Complete DBI workflow
con <- dbConnect(RSQLite::SQLite(), ':memory:')
# 1. Create table
dbWriteTable(con, 'orders',
data.frame(order_id=1:4, customer=c('Alice','Bob','Alice','Carol'),
amount=c(100,200,150,80)))
# 2. Query
totals <- dbGetQuery(con,
'SELECT customer, COUNT(*) orders, SUM(amount) total
FROM orders GROUP BY customer ORDER BY total DESC')
print(totals)
# 3. Clean up
dbDisconnect(con)تحقق سريع
ما الفرق بين dbGetQuery() وdbExecute() في DBI؟
مراجعة: DBI وRSQLite
أهم النقاط المتعلقة بـ DBI وRSQLite:
dbConnect(RSQLite::SQLite(), ':memory:')— إنشاء اتصال SQLite داخل الذاكرةdbWriteTable(con, 'name', df)— تحميل إطار بيانات إلى جدولdbListTables(con)— سرد الجداول؛ وdbListFields(con, 'tbl')— سرد الأعمدةdbGetQuery(con, sql)— تنفيذ SELECT وإرجاع إطار بياناتdbFetch(rs, n=1000)— استرداد النتائج على دفعات للنتائج الكبيرةdbExecute(con, sql)— تنفيذ INSERT/UPDATE/DELETE/DDLdbDisconnect(con)— الإغلاق دائمًا؛ واستخدامon.exit()في الدوال- يعمل DBI مع PostgreSQL وMySQL وBigQuery وغيرها من خلال تبديل برنامج التشغيل
library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ':memory:')
on.exit(dbDisconnect(con))
dbWriteTable(con, 'scores',
data.frame(student=c('Alice','Bob','Carol'), score=c(85,92,78)))
dbExecute(con, 'UPDATE scores SET score = score + 5 WHERE score < 80')
dbGetQuery(con, 'SELECT * FROM scores ORDER BY score DESC')الأسئلة الشائعة
هل درس «أساسيات DBI وRSQLite» مجاني؟
نعم — نص درس «أساسيات DBI وRSQLite» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «أساسيات DBI وRSQLite»؟
اتصل بقواعد بيانات SQLite ونفّذ الاستعلامات واسترجع النتائج باستخدام DBI. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «أساسيات DBI وRSQLite»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات DBI وRSQLite
- الاتصال بـ PostgreSQL وMySQL
- dbplyr: SQL عبر صيغة dplyr
- الاستعلامات ذات المعاملات والمعاملات الذرّية