R dbplyr是否“聪明”到足以确定SQL数据库类型并应用适当的语法?

时间:2019-12-09 15:20:51

标签: sql r dbplyr

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是否将根据数据库类型应用正确的语法?

1 个答案:

答案 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函数来检查特定数据库的翻译。