Поскольку львиная доля бизнес информации храниться в базах данных. На каком бы языке программирования вы не писали, вам придётся производить различные действия с ними.
В этой статье я расскажу о двух интерфейса для работы с базами данных в R. Большая часть примеров демонстрируют работу с Microsoft SQL Server, тем не менее все примеры кода будут работать и с другими базами данных, такими как: MySQL, PostgreSQL, SQLite, ClickHouse, Google BigQuery и др.
Содержание
Если вы интересуетесь анализом данных, и в частности языком R, возможно вам будут интересны мои telegram и youtube каналы. Большая часть контента которых посвящена языку R.
- Требуемое программное обеспечение
- Пакет DBI
- Объектно ориентированный интерфейс взаимодействия с базами данных
- Пакет RODBC
- Заключение
Требуемое программное обеспечение
Для того, что бы повторить все описанные в статье примеры работы с СУБД вам потребуется перечисленное ниже, бесплатное программное обеспечение:
- Язык R;
- Среда разработки RStudio;
- Система Управления Базами Данных, на выбор:
3.1. Microsoft SQL Server
3.2. MySQL
3.3. PostgreSQL
Пакет DBI
Пакет DBI
является наиболее популярным и удобным способом взаимодействия с базами данных в R.
DBI
предоставляет вам набор функций, с помощью которых вы можете управлять базами данных. Но для подключения к базам данных требуется установка дополнительных пакетов, которые являются драйверами к различным системам управления базами данных (СУБД).
Список основных функций DBI
dbConnect
— подключение к базе данных;dbWriteTable
— запись таблицы в базу данных;dbReadTable
— загрузка таблицы из базы данных;dbGetQuery
— загрузка результата выполнения запроса;dbSendQuery
— отправка запроса к базе данных;dbFetch
— извлечение элементов из набора результатов;dbExecute
— выполнение запросов на обновление / удаление / вставку данных в таблицы;dbGetInfo
— запрос информацию о результате запроса или подключении;dbListFields
— запрос списка полей таблицы;dbListTables
— запрос списка таблиц базы данных;dbExistsTable
— проверка наличия таблицы в базе данных;dbRemoveTable
— удаление таблицы из базы данных;dbDisconnect
— разрыв отсоединения с базы данных.
Подключение к базам данных
Для взаимодействия с базами данных предварительно к ним необходимо подключиться. В зависимости от СУБД с которой вы планируете работать вам потребуется дополнительный пакет, ниже перечень наиболее часто используемых.
odbc
— Драйвер для подключения через ODBC интерфейс;RSQLite
— Драйвер к SQLite;RMySQL
/RMariaDB
— Драйвер к СУБД MySQL и MariaDB;RPostgreSQL
— Драйвер к PosrtgreSQL;bigrquery
— Драйвер к Google BigQuery;RClickhouse
/clickhouse
— Драйвер к ClickHouse;RMSSQL
— Драйвер к Microsoft SQL Server (MS SQL), на момент написания статьи присутствует только на GitHub.
Пакет DBI
поставляется с базовой комплектацией R, но пакеты, которые являются драйверами к базам данных необходимо устанавливать с помощью команды install.packages("название драйвера")
.
Для установки пакетов с GitHub вам также понадобится дополнительный пакет — devtools
. Например пакет RMSSQL
на данный момент не опубликован в основном репозитории R пакетов, для его установки воспользуйтесь следующим кодом:
install.packages("devtools")
devtools::install_github("bescoto/RMSSQL")
Пример подключения к Microsoft SQL Server с помощью пакета odbc
Перед использованием любого пакета в R сессии его предварительно необходимо подключить с помощью функции library("название пакета")
.
Я неспроста выбрал Microsoft SQL Server в качестве основной СУБД на которой будет приведена большая часть примеров этой статьи. Дело в том, что это достаточно популярная база данных, но при этом она до сих пор не имеет драйвера для подключения из R опубликованного на CRAN.
Но к счастью SQL Server, как и практически любая другая база имеет ODBC (англ. Open Database Connectivity) интерфейс для подключения. Для подключения к СУБД через ODBC интерфейс в R есть ряд пакетов. Первым мы рассмотрим подключение через пакет odbc
.
# установка пакета odbc
install.packages("odbc")
# подключение пакета
library(odbc)
# подключение к MS SQL
con <- dbConnect(drv = odbc(),
Driver = "SQL Server",
Server = "localhost",
Database = "mybase",
UID = "my_username",
PWD = "my_password",
Port = 1433)
В функцию dbConnect()
вам необходимо первым аргументом drv передать функцию, которая является драйвером для подключения к СУБД (odbc()
). Такие функции обычно называются также, как и СУБД, и поставляются с пакетами которые являются драйверами для DBI
.
Далее необходимо перечислить параметры подключения. Для подключения к MS SQL через ODBC необходимо задать следующие параметры:
- Driver — Название ODBC драйвера;
- Server — IP адрес SQL сервера;
- Database — Название базы данных к которой необходимо подключиться;
- UID — Имя пользователя базы данных;
- PWD — Пароль;
- Port — Порт для подключения, у SQL Server по умолчанию порт 1433.
ODBC драйвер для подключения к Microsoft SQL Server включен в комплектацию Windows, но он может иметь и другое название. Посмотреть список установленных драйверов можно в Администраторе источника данных ODBC. Запустить администратор источника данных в Windows 10 можно по следующему пути:
- 32-разрядной версии:
%systemdrive%\Windows\SysWoW64\Odbcad32.exe
- 64-разрядной версии:
%systemdrive%\Windows\System32\Odbcad32.exe
Получить список всех установленных на вашем ПК драйверов также можно с помощью функции odbcListDrivers()
.
name attribute value
<chr> <chr> <chr>
1 SQL Server APILevel 2
2 SQL Server ConnectFunctions YYY
3 SQL Server CPTimeout 60
4 SQL Server DriverODBCVer 03.50
5 SQL Server FileUsage 0
6 SQL Server SQLLevel 1
7 SQL Server UsageCount 1
8 MySQL ODBC 5.3 ANSI Driver UsageCount 1
9 MySQL ODBC 5.3 Unicode Driver UsageCount 1
10 Simba ODBC Driver for Google BigQuery Description Simba ODBC Driver for Google BigQuery2.0
# ... with 50 more rows
Скачать ODBC драйвера для других СУБД можно по следующим ссылкам:
Для различных СУБД название параметров для подключения могут быть другими, например:
- PostgreSQL / MySQL / MariaDB — user, password, host, port, dbname;
- GoogleBigQuery — project, dataset;
- ClickHouse — user, password, db, port, host;
С помощью администратора источника данных ODBC вы можете запустить мастер для создания ODBC источника данных. Для этого достаточно открыть администратор, перейти на вкладку "Пользовательский DSN" и нажать кнопку "Добавить...".
При создании источника данных используя администратор вы присваиваете ему имя, DSN (Data Source Name).
В примере выше мы создали источник данных с DSN "my_test_source". Теперь мы можем использовать этот источник для подключения к Microsoft SQL Server, и не указывать в коде остальные параметры подключения.
# подключение через DSN
con <- dbConnect(odbc(),
DSN = "my_test_source",
UID = "my_username",
PWD = "my_password")
Посмотреть имена всех созданных на вашем ПК источников данных ODBC можно с помощью функции odbcListDataSources()
.
name description
<chr> <chr>
1 BQ Simba ODBC Driver for Google BigQuery
2 BQ_main Simba ODBC Driver for Google BigQuery
3 BQ ODBC Simba ODBC Driver for Google BigQuery
4 OLX Simba ODBC Driver for Google BigQuery
5 Multicharts Simba ODBC Driver for Google BigQuery
6 PostgreSQL35W PostgreSQL Unicode(x64)
7 hillel_bq Simba ODBC Driver for Google BigQuery
8 blog_bq Simba ODBC Driver for Google BigQuery
9 MyClientMSSQL SQL Server
10 local_mssql SQL Server
11 MSSQL_localhost SQL Server
12 my_test_source SQL Server
13 Google BigQuery Simba ODBC Driver for Google BigQuery
Пример подключения к Microsoft SQL Server с помощью пакета RMSSQL
RMSSQL
не опубликован на CRAN, поэтому установить его можно с GitHub с помощью пакета devtools
.
install.packages("devtools")
devtools::install_github("bescoto/RMSSQL")
# подключение требуемых пакетов
library(RJDBC)
library(RMSSQL)
library(DBI)
# через RMSSQL
con <- dbConnect(MSSQLServer(),
host = 'localhost',
user = 'my_username',
password = 'my_password',
dbname = "mybase")
В большинстве случаев, используя для работы с базами данных пакет DBI
, вы будете подключаться именно таким способом. Т.е. устанавливать один из требуемых пакетов — драйверов, передавая в качестве значения аргумента drv функции dbConnect
, функцию — драйвер для подключения к нужной вам СУБД.
# подключение к MySQL
library(RMySQL)
con <- dbConnect(MySQL(),
host = 'localhost',
user = 'my_username',
password = 'my_password',
dbname = "mybase",
host = "localhost")
# подключение к PostrgeSQL
library(RPostgreSQL)
con <- dbConnect(PostgreSQL(),
host = 'localhost',
user = 'my_username',
password = 'my_password',
dbname = "mybase",
host = "localhost")
# подключение к PostrgeSQL
library(RPostgreSQL)
con <- dbConnect(PostgreSQL(),
host = 'localhost',
user = 'my_username',
password = 'my_password',
dbname = "mybase",
host = "localhost")
# Подключение к SQLite
library(RSQLite)
# connection or create base
con <- dbConnect(drv = SQLite(),
"localhost.db")
# Подключение к Google BigQuery
library(bigrquery)
con <- dbConnect(drv = bigquery(),
project = "my_proj_id",
dataset = "dataset_name")
Как скрыть пароли от базы данных в R скриптах
Выше я привёл несколько примеров которые можно использовать для подключения к любой базе данных но в них есть один минус, в таком виде все доступы к базам данных, включая пароли, хранятся в виде текста в самих скриптах.
Если все ваши скрипты развёрнуты и запускаются исключительно локально на вашем ПК, и он при этом защищён паролем, то скорее всего никакой проблемы в этом не будет. Но если вы совместно с кем то работаете на одном сервере то хранение паролей от баз данных в тексте ваших скриптов не лучшее решение.
В любой операционной системе есть утилита для управления учётными данными. Например, в Windows это диспетчер учетных данных (Credential Manager). Добавить в это хранилище пароль который вы используете для подключения к базе данных можно через пакет keyring
. Пакет кроссплатформенный и приведённый пример будет работать в любой операционной системе, как минимум на Windows, MacOS и Linux.
# install.packages("keyring")
# подключаем пакет
library(keyring)
library(RMSSQL)
# создаём ключ
key_set_with_value(service = "mssql",
username = "my_username",
password = "my_password")
# подключение через RMSSQL
con <- dbConnect(MSSQLServer(),
host = 'localhost',
user = 'my_username',
password = key_get("mssql", "my_username"),
dbname = "mybase")
Т.е. с помощью функции key_set_with_value()
вы добавляете пароль в хранилище учётных данных, а с помощью key_get()
запрашиваете его, при этом запросить пароль может только тот пользователь который добавил его в хранилище. С помощью keyring
можно хранить пароли не только от баз данных, но и от любых сервисов, а так же авторизационные токены при работе с API.
Создание таблиц и запись в базу данных
Запись в базу данных осуществляется функцией dbWriteTable()
.
Аргументы функции dbWriteTable()
:
Жирным шрифтом выделены обязательные аргументы, курсивом — не обязательные
- conn — объект подключения к СУБД, созданный с помощью функции
dbConnect
; - name — название таблицы в СУБД, в которую будут записаны данные;
- value — таблица (объект класса data.frame / data.table / tibble_frame) в R, данные из которого будут записаны в СУБД;
- row.names — Добавляет в таблицу столбец row_names, с номерами строк, по умолчанию имеет значение FALSE.
- overwrite — Перезаписывать таблицу, если таблица с именем указанным в аргументе name уже присутвует в СУБД, по умолчанию имеет значение FALSE;
- append — Дописывать данные, если таблица с именем указанным в аргументе name уже присутвует в СУБД, по умолчанию имеет значение FALSE;
- field.types — Принимает на вход именованный вектор, и задаёт тип данных в каждом поле при записи в СУБД, по умолчанию имеет значение NULL;
- temporary — Позволяет создавать временные таблицы в СУБД, которые будут доступны до момента разрыва соединения с базой, по умолчанию имеет значение FALSE.
# подключаем пакет
library(odbc)
# соединяемся с базой через DSN
con <- dbConnect(odbc(),
DSN = "my_test_source",
UID = "my_username",
PWD = "my_password")
# создаём в базе таблицу iris, и записываем в неё данные из встроенного в R набора iris
dbWriteTable(conn = con,
name = "iris",
value = iris)
# разрыв соединения с БД
dbDisconnect(con)
Для просмотра таблиц в базе данных служит функция dbListTables()
, для удаления таблиц dbRemoveTable()
# подключение пакета
library(odbc)
# подключение к БД
con <- dbConnect(odbc(),
DSN = "my_test_source",
UID = "my_username",
PWD = "my_password")
# просмотр списка таблиц
dbListTables(con)
# удаление таблицы iris
dbRemoveTable(con, "iris")
# разрыв соединения с БД
dbDisconnect(con)
Чтение данных из СУБД
С помощью DBI
вы можете запрашивать либо таблицы целиком, либо результат выполнения вашего SQL запроса. Для выполнения этих операций используются функции dbReadTable()
и dbGetQuery()
.
# подключение пакета
library(odbc)
# подключение к БД
con <- dbConnect(odbc(),
DSN = "my_test_source",
UID = "my_username",
PWD = "my_password")
# загружзка табоицы iris в объект iris
dbiris <- dbReadTable(con, "iris")
# разрыв соединения с БД
dbDisconnect(con)
# подключение пакета
library(odbc)
# подключение к БД
con <- dbConnect(odbc(),
DSN = "my_test_source",
UID = "my_username",
PWD = "my_password")
# Запрашиваем результат выполнения запроса
setosa <- dbGetQuery(con,
"SELECT * FROM iris WHERE Species = 'setosa'")
# разрыв соединения с БД
dbDisconnect(con)
Манипулирование данными в СУБД (DML)
Рассмотренная выше функция dbGetQuery()
используется исключительно для запросов на выборку данных (SELECT).
Для операций манипуляций с данными, таких как UPDATE, INSERT, DELETE, в DBI
существует функция dbExecute()
.
# подключение пакета
library(odbc)
# подключение к БД
con <- dbConnect(odbc(),
DSN = "my_test_source",
UID = "my_username",
PWD = "my_password")
# Вставка строк (INSERT)
dbExecute(con,
"INSERT INTO iris (row_names, [Sepal.Length], [Sepal.Width], [Petal.Length], [Petal.Width], [Species])
VALUES (51, 5.0, 3.3, 1.7, 0.3, 'new_values')")
# Обновление данных (UPDATE)
dbExecute(con,
"UPDATE iris
SET [Species] = 'old_value'
WHERE row_names = 51")
# Удаление строк из таблицы (DELETE)
dbExecute(con, "DELETE FROM iris WHERE row_names = 51")
# разрыв соединения с БД
dbDisconnect(con)
Транзакции в СУБД
Транзакция это последовательное выполнение операций чтения и записи. Окончанием транзакции может быть либо сохранение изменений (фиксация, commit) либо отмена изменений (откат, rollback). Применительно к БД транзакция это нескольких запросов, которые трактуются как единый запрос.
Цитата из статьи "Транзакции и механизмы их контроля"
Транзакция инкапсулирует несколько операторов SQL в элементарную единицу. В DBI
начало транзакции инициируется с помощью dbBegin()
и далее либо подтверждается с помощью dbCommit()
, либо отменяется с помощью dbRollback()
. В любом случае СУБД гарантирует, что: либо все, либо ни одно из утверждений не будут применены к данным.
Для примера, давайте в ходе транзакции добавим в таблицу iris 51 строку, далее изменим значение Sepal.Width в 5 строке, и удалим 43 строку из таблицы.
# подключение пакета
library(odbc)
# подключение к БД
con <- dbConnect(odbc(),
DSN = "my_test_source",
UID = "my_username",
PWD = "my_password")
# запрашиваем значения до внесения изменений
dbGetQuery(con, "SELECT * FROM iris WHERE row_names IN (5, 43, 51)")
# row_names Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5 5.0 3.6 1.4 0.2 setosa
# 2 43 4.4 3.2 1.3 0.2 setosa
# 3 51 7.0 3.2 4.7 1.4 versicolor
# инициируем начало транзакции
dbBegin(con)
# добавляе строку
dbExecute(con,
"INSERT INTO iris
(row_names, [Sepal.Length], [Sepal.Width], [Petal.Length], [Petal.Width], [Species])
VALUES (51, 5.0, 3.3, 1.7, 0.3, 'new_values')")
# меняем строку
dbExecute(con,
"UPDATE iris
SET [Sepal.Width] = 8
WHERE row_names = 5")
# удаляем строку 43
dbExecute(con, "DELETE FROM iris WHERE row_names = 43")
# подтверждаем транзакцию
dbCommit(con)
# запрашиваем значения после внесения изменений
dbGetQuery(con, "SELECT * FROM iris WHERE row_names IN (5, 43, 51)")
# row_names Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5 5 8.0 1.4 0.2 setosa
# 2 51 7 3.2 4.7 1.4 versicolor
# 3 51 5 3.3 1.7 0.3 new_values
# подключение пакета
library(odbc)
# подключение к БД
con <- dbConnect(odbc(),
DSN = "my_test_source",
UID = "my_username",
PWD = "my_password")
# запрашиваем значения до внесения изменений
dbGetQuery(con, "SELECT * FROM iris WHERE row_names IN (5, 43, 51)")
# row_names Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5 5.0 3.6 1.4 0.2 setosa
# 2 43 4.4 3.2 1.3 0.2 setosa
# 3 51 7.0 3.2 4.7 1.4 versicolor
# инициируем начало транзакции
dbBegin(con)
# добавляе строку
dbExecute(con,
"INSERT INTO iris
(row_names, [Sepal.Length], [Sepal.Width], [Petal.Length], [Petal.Width], [Species])
VALUES (51, 5.0, 3.3, 1.7, 0.3, 'new_values')")
# меняем строку
dbExecute(con,
"UPDATE iris
SET [Sepal.Width] = 8
WHERE row_names = 5")
# удаляем строку 43
dbExecute(con, "DELETE FROM iris WHERE row_names = 43")
# отменяем транзакцию
dbRollback(con)
# запрашиваем значения после внесения изменений
dbGetQuery(con, "SELECT * FROM iris WHERE row_names IN (5, 43, 51)")
# row_names Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5 5.0 3.6 1.4 0.2 setosa
# 2 43 4.4 3.2 1.3 0.2 setosa
# 3 51 7.0 3.2 4.7 1.4 versicolor
Объектно ориентированный интерфейс взаимодействия с базами данных
В базовом R объектно ориентированное программирование реализовано на S3 классах, в основе которых лежат обобщённые функции. Эта идея имеет мало общего с классическим объектно ориентированным программированием. Тем не менее пакет R6 реализует классическую реализацию объектно ориентированного программирования в языке R.
Узнать больше про S3 классы можно в статье “ООП в языке R (часть 1): S3 классы”, про R6 классы в статье “ООП в языке R (часть 2): R6 классы”.
Использовать классическое ООП при работе с базами данных довольно удобно. Вы создаёте объект подключения и обращаетесь к его методам. Такую возможность вам даёт пакет rocker
, который является обёрткой над DBI
.
В rocker
реализованы все необходимые функции из DBI
. Для начала необходимо создать объект базы данных, и настроить драйвер.
# устанавливаем rocker
install.packages('rocker')
# подключаем пакеты
library(rocker)
library(odbc)
# создаём объект подключения
db <- newDB(id = 'main db')
# настраиваем драйвер
db$setupDriver(
drv = odbc(),
Driver = "SQL Server",
Server = "localhost",
Database = "mybase",
UID = "my_username",
PWD = "my_password",
Port = 1433
)
# инициализируем подключение
db$connect()
При создании объекта базы данных вы можете использовать аргумент id, тем самым настроить в одной сессии сразу несколько подключений, пометив их идентификаторы.
Под некоторый популярные базы данных в rocker есть встроенные методы настройки драйверов:
db$setupMariaDB()
db$setupPostgreSQL()
db$setupSQLite()
Созданный объект базы данных имеет весь функционал DBI в виде своих методов, но т.к. сам объект подключение хранится внутри экземпляра класса, вам не потребуется использовать его в каждой функции. Ниже пример работы с базой данных с помощью ООП и пакета rocker
:
# создаём таблицу
db$writeTable(
name = "iris",
value = iris
)
# посмотреть списка таблиц
db$listTables()
# чтение таблицы
dbiris <- db$readTable("iris")
# чтение результата запроса
db$getQuery("SELECT * FROM iris WHERE Species = 'setosa'")
# удаление таблицы iris
db$removeTable("iris")
# разрываем соединение
db$disconnect()
По такому же принципу в rocker
реализованы и все остальные функции DBI, в том числе функции для работы с транзакциями.
Помимо объекта подключения вы можете хранить в экземпляре класса имя пользователя и пароль используемые при подключении. Реализовать это можно с помощью аргумента protect
:
db <- rocker::newDB()
# настраиваем драйвер
db$setupDriver(
drv = odbc(),
Driver = "SQL Server",
Server = "localhost",
Database = "mybase",
UID = "my_username",
PWD = "my_password",
Port = 1433,
protect = c("PWD", "UID")
)
# инициализируем подключение
db$connect()
В таком случае при повторном подключение к базе вам не понадобится передавать учётные данные:
# закрываем соединение
db$disconnect()
# инициируем повторное подключение
# при этом не указываем повторно учётные данные
db$connect()
Пакет RODBC
Пакет RODBC
предоставляет автономный интерфейс для подключения и работы с СУБД через ODBC интерфейс.
RODBC
не совместим с DBI
, т.е. вы не можете использовать объект подключения созданный с помощью RODBC
в функциях предоставляемых пакетом DBI
.
Основные функции пакета RODBC
odbcConnect
— Подключение к СУБД через DSN;odbcDriverConnect
— Подключение к базе через строку подключения;sqlQuery
— Отправка запроса в СУБД, и получение результата его выполнения. Поддерживает запросы любого типа: SELECT, UPDATE, INSERT, DELETE.sqlFetch
— Получить целиком таблицу из СУБД;sqlTables
— Получить список таблиц в базе.sqlSave
— Создание новой таблицы в базе данных, или добавление новых данных в уже существующую таблицу;sqlUpdate
— Обновление данных в таблице которая уже существует в СУБД;sqlDrop
— Удаление таблицы в СУБД;odbcClose
— Завершение соединения с СУБД.
Пример работы с RODBC
С моей точки зрения RODBC
менее функционален чем DBI
, но в нём есть все необходимые функции для работы с СУБД.
# подключение пакета
library(RODBC)
# строка подключения
con_string <- odbcDriverConnect(connection = "Driver=SQL Server;Server=localhost;Database=mybase;UID=my_username;PWD=my_password;Port=1433")
# подключение через DSN
con_dsn <- odbcConnect(dsn = "my_test_source",
uid = "my_username",
pwd = "my_password")
# создание таблицы в базе
sqlSave(con_dsn,
dat = iris,
tablename = "iris")
# дописать строки в табдицу iris
sqlSave(con_dsn,
dat = iris,
tablename = "iris",
append = TRUE)
# запрашиваем первые 4 строки
sqlFetch(con_dsn, "iris", rownames = FALSE, max = 4)
# вносим изменение в данные в R
iris[1, 5] <- "virginica"
# обновляем табицу в СУБД
sqlUpdate(con_dsn,
dat = iris,
tablename = "iris")
# запрашиваем первые 4 строки после изменения данных
sqlFetch(con_dsn, "iris", rownames = FALSE, max = 4)
# удаление таблицы
sqlDrop(con_dsn, sqtable = "iris")
# разрыв соеденения с базой
odbcCloseAll()
Транзакционность
По умолчанию транзакционность в RODBC
выключена. Управление транзакциями осуществляется двумя функциями.
odbcSetAutoCommit
— Переключение между обычным и транзакционным режимом работы с СУБД;odbcEndTran
— Подтверждение или отмена транзакции.
Включение и отключение транзакционного режима осуществляется функцией odbcSetAutoCommit
с помощью аргумента autoCommit.
# подключение пакета
library(RODBC)
# подключение через DSN
con_dsn <- odbcConnect(dsn = "my_test_source",
uid = "my_username",
pwd = "my_password")
# создание таблицы в базе
sqlSave(con_dsn,
dat = iris,
tablename = "iris")
# включение транзакционного режима
odbcSetAutoCommit(con_dsn, autoCommit = FALSE)
# запрашиваем первые 4 строки
sqlFetch(con_dsn, "iris", rownames = FALSE, max = 4)
# rownames SepalLength SepalWidth PetalLength PetalWidth Species
# 1 1 5.1 3.5 1.4 0.2 setosa
# 2 2 4.9 3.0 1.4 0.2 setosa
# 3 3 4.7 3.2 1.3 0.2 setosa
# 4 4 4.6 3.1 1.5 0.2 setosa
# вносим изменение в данные в R
iris[1, 5] <- "virginica"
# обновляем табицу в СУБД
sqlUpdate(con_dsn,
dat = iris,
tablename = "iris")
# запрашиваем первые 4 строки
sqlFetch(con_dsn, "iris", rownames = FALSE, max = 4)
# rownames SepalLength SepalWidth PetalLength PetalWidth Species
# 1 1 5.1 3.5 1.4 0.2 virginica
# 2 2 4.9 3.0 1.4 0.2 setosa
# 3 3 4.7 3.2 1.3 0.2 setosa
# 4 4 4.6 3.1 1.5 0.2 setosa
# отменяем изменения
odbcEndTran(con_dsn, commit = FALSE)
# запрашиваем первые 4 строки
sqlFetch(con_dsn, "iris", rownames = FALSE, max = 4)
# rownames SepalLength SepalWidth PetalLength PetalWidth Species
# 1 1 5.1 3.5 1.4 0.2 setosa
# 2 2 4.9 3.0 1.4 0.2 setosa
# 3 3 4.7 3.2 1.3 0.2 setosa
# 4 4 4.6 3.1 1.5 0.2 setosa
# обновляем табицу в СУБД
sqlUpdate(con_dsn,
dat = iris,
tablename = "iris")
# применяем изменения
odbcEndTran(con_dsn, commit = TRUE)
# запрашиваем первые 4 строки после изменения данных
sqlFetch(con_dsn, "iris", rownames = FALSE, max = 4)
# rownames SepalLength SepalWidth PetalLength PetalWidth Species
# 1 1 5.1 3.5 1.4 0.2 virginica
# 2 2 4.9 3.0 1.4 0.2 setosa
# 3 3 4.7 3.2 1.3 0.2 setosa
# 4 4 4.6 3.1 1.5 0.2 setosa
# разрыв соеденения с базой
odbcClose(con_dsn)
Заключение
Два описанных в статье метода работы с базами данных на языке R, DBI
и RODBC
, достаточно универсальны, и будут работать практически с любой СУБД.
Единственная разница в работе между различными СУБД заключается в процессе подключения. Для большинства популярных СУБД существуют отдельные пакеты которые являются драйверами. Для остальных СУБД необходимо настраивать подключение через ODBC интерфейс используя пакеты odbc
или RODBC
. Все остальные манипуляции, вне зависимости от выбранной вами СУБД, будут неизменны. Исключением является отправка SQL запросов, в зависимости от SQL диалекта который поддерживается СУБД с которой вы работаете.
P.S.
Если вы дочитали стататью, то наверняка интересуетесь языком R, в таком случае думаю вам будет интересен мой телеграм и youtube каналы, большая часть контента которых посвящена языку R. Подписывайтесь.