0Pricing
R Academy · 강의

DBI와 RSQLite 기초

DBI로 SQLite 데이터베이스에 연결하고 쿼리를 실행하며 결과를 가져옵니다.

DBI와 RSQLite 기초은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

DBI를 사용한 R의 데이터베이스 액세스

DBI 패키지는 R에서 데이터베이스에 액세스하기 위한 통합 인터페이스를 제공합니다. DBI에 백엔드 드라이버 패키지를 결합하면 서로 다른 데이터베이스 백엔드(SQLite, PostgreSQL, MySQL 등)에서 동일한 함수를 사용할 수 있습니다. 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() — SELECT가 아닌 SQL 실행하기

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에 적재하기

실용적인 예로, R에 기본으로 포함된 mtcars 데이터 세트를 SQLite에 적재한 다음 SQL 쿼리를 실행해 보겠습니다. 이 예제에서는 전체 DBI 작업 흐름을 보여 주며 R에서 SQL을 연습할 수 있습니다.

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 작업 흐름은 데이터베이스 백엔드와 관계없이 일관된 패턴을 따릅니다. 연결 → 적재/쿼리 → 연결 해제의 순서입니다. dbConnect()에서 드라이버만 바꾸면 SQLite, PostgreSQL, MySQL 등에서 동일한 코드를 사용할 수 있습니다.

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)

빠른 확인

DBI에서 dbGetQuery()와 dbExecute()의 차이는 무엇입니까?

요약: 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 기초” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“DBI와 RSQLite 기초”에서 뭘 배우나요?

DBI로 SQLite 데이터베이스에 연결하고 쿼리를 실행하며 결과를 가져옵니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“DBI와 RSQLite 기초” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. DBI와 RSQLite 기초
  2. PostgreSQL 및 MySQL 연결하기
  3. dbplyr: dplyr 구문으로 SQL 사용하기
  4. 매개변수화된 쿼리와 트랜잭션
← R Academy(으)로 돌아가기