Vignette มาถึงก่อนหน้านี้โปรดตรวจสอบการพูดคุยที่นำเสนอที่ผู้ใช้! การประชุม 2018:
เพื่อให้สามารถเชื่อมต่อกับฐานข้อมูลได้จะมีการระบุพารามิเตอร์การเชื่อมต่อในไฟล์ YAML เช่นสำหรับฐานข้อมูล SQLite ที่จะสร้างในไฟล์ TEMP:
sqlite :
drv : !expr RSQLite::SQLite()
dbname : !expr tempfile()
โดยค่าเริ่มต้น dbr
จะค้นหาไฟล์ชื่อ db_config.yaml
ในไดเรกทอรีการทำงานปัจจุบันซึ่งสามารถแทนที่ผ่านตัวเลือก dbr.db_config_path
ทั่วโลกเช่นตัวอย่างการกำหนดค่าที่รวมอยู่ในแพ็คเกจนี้:
options( dbr.db_config_path = system.file( ' example_db_config.yaml ' , package = ' dbr ' ))
ตัวอย่างที่ซับซ้อนมากขึ้นจากไฟล์ Demo Yaml ที่อธิบายการเชื่อมต่อ MySQL ไปยังฐานข้อมูลที่โฮสต์โดย RSTUDIO (พร้อมชื่อผู้ใช้และรหัสผ่านสาธารณะ):
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 Chunks ซ้ำคุณสามารถแสดงรายการ SQL Queries ของคุณ (หรือบางส่วน) ในไฟล์ YAML ที่มีโครงสร้างเช่นในตัวอย่าง 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
รับปุ่ม count
จากรายการ countries
ในส่วน shinydemo
ของ dbr
คุณสามารถทำอะไรบางอย่างเช่น:
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 Chunks สามารถกำหนดไว้ในไฟล์นอก YAML ด้วยส่วนขยายไฟล์ sql
และอ้างอิงด้วยแท็ก !include
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
ในโหนดรูท
อย่างที่คุณเห็นจากด้านบนพลังหลักของวิธีการ templating นี้คือคุณสามารถนำชิ้นส่วน 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
ที่ระบุคำถามย่อยที่เกี่ยวข้องกับ Country
ใน dbr.shinydemo.countries.europe
key ตาม:
SELECT Name
FROM City
WHERE CountryCode IN (
{sql_chunk( ' dbr.shinydemo.countries.europe ' , indent_after_linebreak = 2 )})
พารามิเตอร์ indent_after_linebreak
เป็นเพียงการอัปเดตเครื่องสำอางในแบบสอบถามเพื่อจัดตำแหน่ง FROM
และ WHERE
ในอักขระเดียวกันในคำสั่ง SQL
ตัวอย่างที่ซับซ้อน / ซ้อนกันมากขึ้น:
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')))