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创建
答案 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]