R Academy · レッスン

DBIとRSQLiteの基礎

DBIを使ってSQLiteデータベースに接続し、クエリを実行して結果を取得します。

レッスン 1/413 ステップ

「DBIとRSQLiteの基礎」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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()を1ステップにまとめたものです。

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() — 結果を分割して取得

大規模な結果セットには、3ステップの方法を使用します。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に読み込む

実践例として、組み込みの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')
無料で開始

AI チューターと学ぶ R — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
43
レッスン
159

よくある質問

「DBIとRSQLiteの基礎」レッスンは無料ですか?

はい。「DBIとRSQLiteの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「DBIとRSQLiteの基礎」で何を学びますか?

DBIを使ってSQLiteデータベースに接続し、クエリを実行して結果を取得します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「DBIとRSQLiteの基礎」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DBIとRSQLiteの基礎
  2. PostgreSQLとMySQLへの接続
  3. dbplyr:dplyr構文でSQLを扱う
  4. パラメーター化クエリとトランザクション
← R Academyに戻る