¡La viñeta que viene, hasta entonces, consulte la charla presentada en el usuario! Conferencia de 2018:
Para poder conectarse a una base de datos, los parámetros de conexión se especificarán en un archivo YAML, por ejemplo, para que se cree una base de datos SQLite en un archivo TEMP:
sqlite :
drv : !expr RSQLite::SQLite()
dbname : !expr tempfile()
De manera predeterminada, dbr
buscará un archivo llamado db_config.yaml
en el directorio de trabajo actual, que se puede anular a través de la opción dbr.db_config_path
Global, por ejemplo, a la configuración de ejemplo incluido en este paquete:
options( dbr.db_config_path = system.file( ' example_db_config.yaml ' , package = ' dbr ' ))
Un ejemplo más complejo del archivo Demo YAML que describe una conexión MySQL a una base de datos alojada por RSTUDIO (con nombre de usuario y contraseña pública):
shinydemo :
drv : !expr RMySQL::MySQL()
host : shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com
username : guest
password : guest
dbname : shinydemo
Tenga en cuenta que, en lugar de cadenas simples, también puede especificar contraseñas cifradas de KMS, otros secretos y parámetros, por ejemplo, por ejemplo:
redshift :
host : !aws_kms |
KMSencryptedciphertext...
port : 5439
dbname : dbname
user : username
drv : !expr RPostgreSQL::PostgreSQL()
password : !aws_kms |
KMSencryptedciphertext...
s3_copy_bucket : !attr |-
's3://openmail-model/temp'
s3_copy_iam_role : !attr |-
arn:aws:iam::accountid:role/redshift_role
Una vez que los parámetros de conexión se cargan desde un archivo de configuración, hacer consultas SQL es tan fácil como especificar la instrucción SQL y el nombre de la conexión:
db_query( ' show tables ' , ' shinydemo ' )
# > INFO [2019-01-06 01:06:18] Connecting to shinydemo
# > INFO [2019-01-06 01:06:19] Executing:**********
# > INFO [2019-01-06 01:06:19] show tables
# > INFO [2019-01-06 01:06:19] ********************
# > INFO [2019-01-06 01:06:19] Finished in 0.1336 secs returning 3 rows
# > INFO [2019-01-06 01:06:19] Closing connection to shinydemo
# > Tables_in_shinydemo
# > 1 City
# > 2 Country
# > 3 CountryLanguage
Para un uso más avanzado, por ejemplo, conexiones de bases de datos de almacenamiento en caché, check ?db_connect
y la viñeta mencionada anteriormente.
Para reutilizar los fragmentos de SQL, puede enumerar sus consultas SQL (o partes) en un archivo YAML estructurado, como en la configuración de Ejemplo Bundled en example_sql_chunks.yaml
Use sql_chunk_files
para enumerar o actualizar los archivos YAML de plantilla SQL utilizados actualmente, por ejemplo
sql_chunk_files(system.file( ' example_sql_chunks.yaml ' , package = ' dbr ' ))
Luego, puede referirse a cualquier clave en esa definición mediante una cadena que consiste en las teclas en la jerarquía separadas por un punto, por lo que mirar la siguiente definición (parte de example_sql_chunks.yaml
):
dbr :
shinydemo :
countries :
count : SELECT COUNT(*) FROM Country
Obteniendo la llave count
para el artículo countries
en la sección shinydemo
de dbr
, podría hacer algo como:
sql_chunk( ' dbr.shinydemo.countries.count ' )
# > SELECT COUNT(*) FROM Country
Y pasarlo de inmediato a db_query
:
countries <- db_query(sql_chunk( ' dbr.shinydemo.countries.count ' ), ' shinydemo ' )
# > INFO [2019-01-06 01:33:33] Connecting to shinydemo
# > INFO [2019-01-06 01:33:34] Executing:**********
# > INFO [2019-01-06 01:33:34] SELECT COUNT(*) FROM Country
# > INFO [2019-01-06 01:33:34] ********************
# > INFO [2019-01-06 01:33:34] Finished in 0.1291 secs returning 1 rows
# > INFO [2019-01-06 01:33:34] Closing connection to shinydemo
Los fragmentos SQL también se pueden definir en archivos fuera del YAML con las extensiones de archivo sql
, y se hace referencia a la etiqueta !include
dbr :
shinydemo :
countries :
europe : !include europe.sql
Esto leerá el contenido de europe.sql
y lo pondrá a disposición como sql_chunk('dbr.shinydemo.countries.count')
.
Además de los archivos, también se puede incluir una carpeta con archivos sql
, en ese caso, el nombre de archivo base (sin la extensión del archivo sql
) se convertirá en la clave bajo la clave dada. Por ejemplo, considere esta definición de Yaml:
cities : !include cities.sql
Cargará todos los archivos de la carpeta cities.sql
y pondrá a disposición los que están disponibles en europe
, por lo que dar como resultado un YAML intermedio como:
cities: !include cities.sql
europe: |-
SELECT Name
FROM City
WHERE CountryCode IN (
{sql_chunk('dbr.shinydemo.countries.europe', indent_after_linebreak = 2)})
europe_large: |-
SELECT Name
FROM City
WHERE
Population > 1000000 AND
Name IN (
{sql_chunk('dbr.shinydemo.cities.europe', indent_after_linebreak = 4)}))
Si la clave de un directorio !include
es ~!
, entonces las claves están disponibles en el nodo principal, así que por ejemplo
cities:
~!: !include cities.sql
En realidad, no crearía la clave cities
, sino solo las claves europe
y europe_large
en el nodo raíz.
Como puede ver en lo anterior, el poder principal de este enfoque de plantilla es que puede reutilizar fácilmente los fragmentos SQL, por ejemplo, para la lista de países europeos en:
cities <- db_query(sql_chunk( ' dbr.shinydemo.cities.europe ' ), ' shinydemo ' )
# > INFO [2019-01-06 01:32:02] Connecting to shinydemo
# > INFO [2019-01-06 01:32:02] Executing:**********
# > INFO [2019-01-06 01:32:02] SELECT Name
# > FROM City
# > WHERE CountryCode IN (
# > SELECT Code
# > FROM Country
# > WHERE Continent = 'Europe')
# > INFO [2019-01-06 01:32:02] ********************
# > INFO [2019-01-06 01:32:02] Finished in 0.1225 secs returning 643 rows
# > INFO [2019-01-06 01:32:02] Closing connection to shinydemo
Donde se especificó la subconsulta relacionada con Country
en el dbr.shinydemo.countries.europe
Key según:
SELECT Name
FROM City
WHERE CountryCode IN (
{sql_chunk( ' dbr.shinydemo.countries.europe ' , indent_after_linebreak = 2 )})
El parámetro indent_after_linebreak
es solo para actualizaciones cosméticas en la consulta para alinearse FROM
y WHERE
en el mismo carácter en la instrucción SQL.
Ejemplo aún más complejo / anidado:
sql_chunk( ' dbr.shinydemo.cities.europe_large ' )
# > SELECT Name
# > FROM City
# > WHERE
# > Population > 1000000 AND
# > Name IN (
# > SELECT Name
# > FROM City
# > WHERE CountryCode IN (
# > SELECT Code
# > FROM Country
# > WHERE Continent = 'Europe')))