您可以命名dbplyr的模拟惰性表吗?

时间:2019-12-12 15:24:54

标签: sql r lazy-evaluation dbplyr

HttpClient具有一些非常有用的模拟功能,因此您可以在不连接任何实际数据库的情况下编写查询,但是我似乎无法以这种方式编写的任何查询都获得实际的表名。它们的所有名称都只是@angular/common/http,此后我似乎无法对其进行修改。实际上,我在查询对象或其属性(没有任何属性)的任何地方都看不到dbplyr,所以现在我完全不知道`df`如何处理表名。

MWE:

`df`

顺便说一句,我的用例是我需要在具有实际服务器访问权限的另一个系统中运行SQL查询,因此我想拥有R脚本来生成可以在该系统中运行的SQL语法。 R无法连接到它。使用真实结构(表和列名,列类型,但没有行)构造一个空的虚拟数据库是一种选择,但是,显然,仅使用这些自由格式的模拟(如果使用SQL)会更简单可以生成以准备剪切和粘贴。 (dbplyr看起来更适合于这种不存在的表,但是,猜猜它实际上只是library(dbplyr) library(dplyr, warn.conflicts = FALSE) library(magrittr) library(purrr, warn.conflicts = FALSE) query <- tbl_lazy(df = mtcars) query %$% names(ops) #> [1] "x" "vars" show_query(query) #> <SQL> #> SELECT * #> FROM `df` # The actual data frame is stored in the object under the name `x`, but # renaming it has no effect, unsurprisingly (since it wasn't named `df` # anyway) query %<>% modify_at("ops", set_names, "mtcars", "vars") query %$% names(ops) #> [1] "mtcars" "vars" show_query(query) #> <SQL> #> SELECT * #> FROM `df` 的包装,因此,同样的lazy_frame()名称问题。)

reprex package(v0.3.0)于2019-12-12创建

1 个答案:

答案 0 :(得分:0)

我不知道重命名模拟表的任何方法。根据文档,simulate_*函数的重点是在不实际连接数据库的情况下测试数据库转换。

连接到远程表时,dbplyr使用通过tbl()定义的数据库,架构和表名。它还获取列名。因此,我建议在R可以连接到数据库的环境中进行开发。请考虑以下内容:

# simulated
df_sim = tbl_lazy(mtcars, con = simulate_mssql())
df_sim %>% head(5) %>% show_query()

# output
<SQL>
SELECT TOP(5) *
FROM `df`

# actual
df = tbl('db_table_name', con = database_connection_object)
df %>% head(5) %>% show_query()

# output
<SQL>
SELECT TOP(5) col1, col2, col3
FROM "database"."db_table_name"

不仅df被表名替换,而且模拟查询中的*也被第二个查询的列名替换。

您可能会考虑通过模拟生成SQL脚本是否重要的​​一个选择是转换为文本,替换并转换回。例如:

df_sim = tbl_lazy(mtcars, con = simulate_mssql())
query = df_sim %>% head(5) %>% as.character()
query = gsub("`df`", "[db].[schema].[table]", query)

# write query out to file
writeLines(query, "file.sql")
# OR create a remote connection
remote_table = tbl(db_connection, sql(query))

remote_table %>% show_query()
# output
<SQL>
SELECT TOP(5) *
FROM [db].[schema].[table]