如何让dbplyr的in_schema函数引用Snowflake中不同仓库的表
标准解决方案
对于Snowflake这类支持「数据库.模式.表」三层命名空间的数据源,你可以用以下两种原生支持的方法实现跨库表引用,不会生成冗余子查询,也不会被当前会话的默认数据库拼接前缀:
- 使用DBI包的
Id函数显式指定完整路径(最通用,兼容所有dbplyr版本)
library(DBI) # 按参数显式指定数据库、模式、表名 ca <- tbl(conn, Id( database = "WH_b", schema = "schema_c", table = "table_ca" ))
该方法生成的SQL会直接使用完整的WH_b.schema_c.table_ca作为表标识,和手动写原生SQL的效果一致,但完全兼容dbplyr的后续语法转换。
2. 嵌套使用in_schema函数(适用于dbplyr 2.3.0及以上版本)
新版本in_schema支持将另一个in_schema的返回值作为第一个参数,实现三层路径的声明:
ca <- tbl(conn, in_schema( in_schema("WH_b", "schema_c"), "table_ca" ))
优化建议
如果需要频繁引用某个跨库模式下的表,可以提前把模式路径封装为变量,减少重复代码:
# 预定义跨库的模式路径 whb_schema_c <- in_schema("WH_b", "schema_c") # 后续直接引用该模式下的任意表 ca <- tbl(conn, in_schema(whb_schema_c, "table_ca")) other_table <- tbl(conn, in_schema(whb_schema_c, "table_cb"))
内容的提问来源于stack exchange,提问作者aris
相关产品推荐
相关产品推荐

