library(tidyverse)
con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
copy_to(con, mtcars)
mtcars2 <- tbl(con, "mtcars")
在我开始学习SQL时,我的第一堂课就是语法将因数据库类型而异。
例如,这种查询通常可以工作:
mtcars3 <- DBI::dbGetQuery(con, "SELECT * FROM mtcars LIMIT 5")
但是在某些SQL数据库上,我尝试SELECT * FROM xyz LIMIT 5
并收到语法错误。然后,我尝试以下方法:
DBI::dbGetQuery(con, "SELECT TOP 5 * FROM xyz")
我就能得到想要的结果。
这使我感到非常好奇,当我开始完全使用dbplyr并完全放弃使用SQL查询时(可能的话)会发生什么。 dbplyr是否足够“智能”以识别我正在使用的不同SQL数据库?更重要的是,dbplyr是否将根据数据库类型应用正确的语法?
答案 0 :(得分:2)
是的,dbplyr
足够“聪明”,可以在将dplyr
命令转换为数据库(SQL)语法时使用表的连接类型。考虑以下示例:
library(dplyr)
library(dbplyr)
data(mtcars)
# mimic postgre database
df_postgre = tbl_lazy(mtcars, con = simulate_postgres())
df_postgre %>% head(5) %>% show_query()
# resulting SQL translation
<SQL>
SELECT *
FROM `df`
LIMIT 5
# mimic MS server database
df_server = tbl_lazy(mtcars, con = simulate_mssql())
df_server %>% head(5) %>% show_query()
# resulting SQL translation
<SQL>
SELECT TOP(5) *
FROM `df`
您可以尝试使用simulate_*
中不同的dbplyr
函数来检查特定数据库的翻译。