Uso JDBC en R para conexión a base de datos

Publicado el 14 septiembre 2018 por Daniel Rodríguez @analyticslane

La utilización de JDBC en R para acceder a las bases de datos ofrecer grandes ventajas frente a la utilización de paquetes específicos. En primer lugar, al utilizar un API estándar es más fácil cambiar el motor de base de datos. Por otro lado, al utilizar una maquina virtual Java la solución se hace independientemente del sistema operativo.

Introducción

En muchas soluciones analíticas es necesario poder importar los datos desde una base de datos. Cuando los datos no cambian se puede trabajar con una extracción de estos, pero no en caso contrario. En R existen múltiples paquetes para acceder a diferentes bases de datos como pueden ser: RSQLite, RPostgres o ROracle. La utilización de un paquete diferente para cada motor de base de datos presenta un problema cuando se desea cambiar el mismo. En la mayoría de los casos se tendrá que revisar el código de utilizado y puede ser necesario reescribirlo. Una solución a este problema se puede encontrar en el paquete RJDBC.

El paquete RJDBC utiliza JDBC para acceder a los datos. JDBC ( Java Database Connectivity) es un API que permite ejecutar operaciones sobre bases de datos desde Java. Al utilizar Java la conexión es independientemente del sistema operativo en el que se ejecute. Los drivers necesarios para acceder a las bases de datos son Java y existen para la mayoría de las bases de datos del mercado.

Instalación de RJDBC en R

El paquete RJDBC se encuentra disponible en el CRAN, por lo que únicamente se ha de utilizar el comando:

install.packages("RJDBC")

Acceso a base de datos JDBC en R

El proceso de conexión a las bases de datos desde R es tremendamente sencillo. Inicialmente se ha de cargar importar la librería en el espacio de trabajo. Una vez realizado este proceso se ha de cargar el controlador para la base de datos y abrir una conexión con este.

# Se carga el paquete para utilizar los drivers JDBC
library(RJDBC)

# Carga del driver
drv = JDBC("java.class", "javaClassFile.jar")

# Apertura de la conexión
conn = dbConnect(drv, "URL:Database", "username", "password")

La cadena de texto "java.class" depende de la base de datos, como ejemplo se puede enumerar las mas populares:

  • SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver
  • Oracle: oracle.jdbc.driver.OracleDriver
  • SQLite: org.sqlite.JDBC
  • Postgres: org.postgresql.Driver
  • MySQL: com.mysql.jdbc.Driver

Por otro lado, la URL a la base de datos se ha de configurar de manera diferente dependiendo del tipo de base datos utilizado. Al igual que antes se pueden enumerar las estructuras de las bases de datos más populares:

  • SQL Server: jdbc:sqlserver://serverName
  • Oracle: jdbc:oracle:thin:@<host>:<port default=1521>:<SID>
  • SQLite: jdbc:sqlite:pathToFilename.db
  • Postgres: jdbc:postgresql://serverName:5432/mydbname
  • MySQL: jdbc:mysql://serverName/mydbname

La utilización de la base de datos se realiza mediante las funciones del paquete DBI, las consultas y resto de accesos a la base de datos se realizan con los comandos de este paquete.

Finalmente, al finalizar el trabajo con la base de datos se ha de cerrar la conexión.

# Cierre de la conexión
dbDisconnect(conn)

Ejemplos de uso

A continuación, se muestra múltiples ejemplos de cómo se ha de realizar la conexión a diferentes bases de datos. En concreto se muestra las conexiones a SQLite, Oracle y Postgres.

SQLite

drv 	= JDBC('org.sqlite.JDBC', fileName)
jdbcStr = paste('jdbc:sqlite:', fileName, sep='')
con     = dbConnect(drv, jdbcStr, '', '')

Oracle

drv     = JDBC('oracle.jdbc.driver.OracleDriver', fileName)
jdbcStr = paste('jdbc:oracle:thin:@', server, ':', port, ':', sid, sep='')
con     = dbConnect(drv, jdbcStr, user, pass)

Postgress

drv     = JDBC( 'org.postgresql.Driver', fileName)
jdbcStr = paste('jdbc:postgresql://' server ':' port '/' database',  sep='')
con     = dbConnect(drv, jdbcStr, user, pass)

Conclusiones

En esta entrada se ha visto cómo utilizar el paquete RJDBC para acceder a bases de datos desde R. Al estar basado el Java se garantiza que el código se puede utilizar en cualquier sistema en el que se encuentre tanto Java como R. Permitiendo también trabajar con cualquier base de datos.

Imágenes: Pixabay