القصيرة القادمة ، حتى ذلك الحين ، يرجى التحقق من الحديث المقدم في المستخدم! مؤتمر 2018:
لتكون قادرًا على الاتصال بقاعدة بيانات ، يجب تحديد معلمات الاتصال في ملف YAML ، على سبيل المثال لقاعدة بيانات SQLite التي سيتم إنشاؤها في ملف مؤقت:
sqlite :
drv : !expr RSQLite::SQLite()
dbname : !expr tempfile()
بشكل افتراضي ، سيبحث dbr
عن ملف يدعى db_config.yaml
في دليل العمل الحالي ، يمكن تجاوزه عبر الخيار dbr.db_config_path
GLOBAL ، على سبيل المثال ، على سبيل المثال التكوين المجمعة في هذه الحزمة:
options( dbr.db_config_path = system.file( ' example_db_config.yaml ' , package = ' dbr ' ))
مثال أكثر تعقيدًا من ملف 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 ، يمكنك سرد استعلامات SQL الخاصة بك (أو أجزاء منه) في ملف yaml منظم ، كما هو الحال في مثال تكوينه على example_sql_chunks.yaml
استخدم sql_chunk_files
لسرد أو تحديث ملف (ملفات) قالب SQL المستخدم حاليًا ، على سبيل المثال عبر
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
في قسم dbr
shinydemo
، يمكنك القيام بشيء مثل:
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
، والرجوع إليها مع علامة !include
في ملف YAML ، على سبيل المثال:
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
حيث تم تحديد الانبعاث الفرعي المرتبط Country
في مفتاح dbr.shinydemo.countries.europe
حسب:
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')))