0Pricing
R Academy · บทเรียน

พื้นฐาน DBI และ RSQLite

เชื่อมต่อฐานข้อมูล SQLite เรียกใช้คำสั่งสืบค้น และดึงผลลัพธ์ด้วย DBI

พื้นฐาน DBI และ RSQLite เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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/DDL
  • dbDisconnect(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” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน DBI และ RSQLite”

เชื่อมต่อฐานข้อมูล SQLite เรียกใช้คำสั่งสืบค้น และดึงผลลัพธ์ด้วย DBI คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “พื้นฐาน DBI และ RSQLite” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน DBI และ RSQLite
  2. การเชื่อมต่อ PostgreSQL และ MySQL
  3. dbplyr: SQL ผ่านไวยากรณ์ dplyr
  4. คำสั่งสืบค้นแบบกำหนดพารามิเตอร์และธุรกรรม
← กลับไปที่ R Academy