Vignette來了,在此之前,請檢查向用戶提出的演講! 2018會議:
為了能夠連接到數據庫,要在YAML文件中指定連接參數,例如,對於要在temp文件中創建的SQLITE數據庫:
sqlite :
drv : !expr RSQLite::SQLite()
dbname : !expr tempfile()
默認情況下, dbr
將在當前工作目錄中查找一個名為db_config.yaml
的文件,可以通過dbr.db_config_path
global選項覆蓋該文件,例如,在此軟件包中捆綁了示例config:
options( dbr.db_config_path = system.file( ' example_db_config.yaml ' , package = ' dbr ' ))
一個更複雜的示例來自Demo YAML文件,描述了Rstudio託管的數據庫的MySQL連接(帶有公共用戶名和密碼):
shinydemo :
drv : !expr RMySQL::MySQL()
host : shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com
username : guest
password : guest
dbname : shinydemo
請注意,您還可以指定kms加密密碼,其他秘密和參數,例如:
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
一旦從配置文件加載連接參數後,製作SQL查詢就與指定SQL語句和連接名稱一樣容易:
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
對於更高級的用法,例如緩存數據庫連接,檢查?db_connect
和上述小插圖。
要重複使用SQL塊,您可以在結構化的YAML文件中列出SQL查詢(或部分),就像bundled示例配置中的示例example_sql_chunks.yaml
一樣
使用sql_chunk_files
列出或更新當前使用的SQL模板yaml文件,例如通過
sql_chunk_files(system.file( ' example_sql_chunks.yaml ' , package = ' dbr ' ))
然後,您可以通過字符串中的字符串中的任何鍵,這些鍵由層次結構中的鍵組成,因此請查看以下定義( example_sql_chunks.yaml
的一部分):
dbr :
shinydemo :
countries :
count : SELECT COUNT(*) FROM Country
從dbr
的shinydemo
部分中獲取countries
項目的count
密鑰,您可以做類似的事情:
sql_chunk( ' dbr.shinydemo.countries.count ' )
# > SELECT COUNT(*) FROM Country
並立即將其傳遞給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塊也可以在YAML外部使用sql
文件擴展名中定義,並用yaml文件中的!include
tag引用,例如:
dbr :
shinydemo :
countries :
europe : !include europe.sql
這將讀取歐洲的內容europe.sql
,並以sql_chunk('dbr.shinydemo.countries.count')
提供。
除文件外,還可以包括一個帶有sql
文件的文件夾 - 在這種情況下,基本文件名(無sql
文件擴展名)將成為給定密鑰下的密鑰。例如,考慮此YAML定義:
cities : !include cities.sql
將加載來自cities.sql
文件夾的所有文件,並在europe
下提供這些文件,因此導致中級YAML為:
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)}))
如果目錄的鍵!include
~!
,然後在父節點中提供密鑰,因此
cities:
~!: !include cities.sql
實際上不會創建cities
密鑰,而只能在根節點中europe
和europe_large
鍵。
從上面可以看出,這種模板方法的主要力量是您可以輕鬆地重用SQL塊,例如歐洲國家列表:
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
在dbr.shinydemo.countries.europe
鍵上指定了與Country
相關的子查詢的地方:
SELECT Name
FROM City
WHERE CountryCode IN (
{sql_chunk( ' dbr.shinydemo.countries.europe ' , indent_after_linebreak = 2 )})
indent_after_linebreak
參數僅適用於查詢中的化妝品更新,以與SQL語句中的相同字符FROM
和WHERE
。
更複雜 /嵌套的示例:
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')))