Vignette kommt bis dahin, bis dahin überprüfen Sie bitte den Vortrag, der beim Benutzer präsentiert wird! 2018 Konferenz:
Um eine Verbindung zu einer Datenbank herstellen zu können, müssen die Verbindungsparameter in einer YAML -Datei angegeben werden, beispielsweise für eine SQLite -Datenbank, die in einer TEMP -Datei erstellt werden soll:
sqlite :
drv : !expr RSQLite::SQLite()
dbname : !expr tempfile()
Standardmäßig sucht dbr
nach einer Datei mit dem Namen db_config.yaml
im aktuellen Arbeitsverzeichnis, das über die Option dbr.db_config_path
überschrieben werden kann, z. B. in das in diesem Paket gebündelte Beispielkonfiguration:
options( dbr.db_config_path = system.file( ' example_db_config.yaml ' , package = ' dbr ' ))
Ein komplexeres Beispiel aus der Demo -Yaml -Datei, in der eine MySQL -Verbindung zu einer von RSTUDIO gehosteten Datenbank (mit öffentlichem Benutzername und Passwort) beschrieben wird:
shinydemo :
drv : !expr RMySQL::MySQL()
host : shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com
username : guest
password : guest
dbname : shinydemo
Beachten Sie, dass Sie anstelle von einfachen Zeichenfolgen auch KMS-zerbrechliche Passwörter, andere Geheimnisse und Parameter angeben können, z. B.:
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
Sobald die Verbindungsparameter aus einer Konfigurationsdatei geladen wurden, sind die SQL -Abfragen so einfach wie die Angabe der SQL -Anweisung und des Namens der Verbindung:
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
Für fortgeschrittenere Verwendung, z. B. die Datenbankverbindungen, die ?db_connect
für die Caching -Datenbank und die oben genannte Vignette überprüfen können.
Um SQL -Stücke wiederzuverwenden, können Sie Ihre SQL -Abfragen (oder Teile davon) in einer strukturierten YAML -Datei auflisten, wie in der gebündelten Beispielkonfiguration unter example_sql_chunks.yaml
Verwenden Sie sql_chunk_files
, um die aktuell verwendeten SQL -Vorlage YAML -Datei (n) aufzulisten oder zu aktualisieren.
sql_chunk_files(system.file( ' example_sql_chunks.yaml ' , package = ' dbr ' ))
Anschließend können Sie auf einen Schlüssel in dieser Definition verweisen, der aus den Tasten in der Hierarchie besteht, die durch einen Punkt getrennt sind, daher die folgende Definition (Teil von example_sql_chunks.yaml
):
dbr :
shinydemo :
countries :
count : SELECT COUNT(*) FROM Country
Wenn Sie den count
für den countries
in DBRs shinydemo
-Abschnitt von dbr
erhalten, können Sie so etwas wie:
sql_chunk( ' dbr.shinydemo.countries.count ' )
# > SELECT COUNT(*) FROM Country
Und übergeben Sie es sofort an 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
SQL -Stücke können auch in Dateien außerhalb des YAML mit den sql
-Dateiverlängerungen definiert und mit dem !include
-Tag in die YAML -Datei in der YAML -Datei verwiesen, z. B.:
dbr :
shinydemo :
countries :
europe : !include europe.sql
Dadurch wird der Inhalt von europe.sql
gelesen und ihn als sql_chunk('dbr.shinydemo.countries.count')
verfügbar gemacht.
Neben Dateien kann auch ein Ordner mit sql
-Dateien enthalten sein - in diesem Fall wird der Basis -Dateiname (ohne die sql
-Dateierweiterung) unter dem angegebenen Schlüssel zum Schlüssel. Betrachten Sie beispielsweise diese YAML -Definition:
cities : !include cities.sql
Laden Sie alle Dateien aus dem Ordner cities.sql
europe
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)}))
Wenn der Schlüssel eines Verzeichnisses !include
~!
und dann werden die Schlüssel im übergeordneten Knoten zur Verfügung gestellt, also z.
cities:
~!: !include cities.sql
Würde den cities
nicht erstellen, sondern nur die Tasten europe
und europe_large
im Stammknoten.
Wie Sie aus den oben genannten sehen können, besteht die Hauptkraft dieses Vorlagenansatzes darin, dass Sie SQL -Stücke leicht wiederverwenden können, z. B. für die Liste der europäischen Länder in:
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
Wo die von Country
bezogene Unterabfrage in der dbr.shinydemo.countries.europe
Key wie per:
SELECT Name
FROM City
WHERE CountryCode IN (
{sql_chunk( ' dbr.shinydemo.countries.europe ' , indent_after_linebreak = 2 )})
Der Parameter indent_after_linebreak
dient nur für kosmetische Updates in der Abfrage, FROM
und WHERE
auf demselben Zeichen in der SQL -Anweisung ausgerichtet ist.
Noch komplexeres / verschachtelteres Beispiel:
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')))