使用DBI::dbWriteTable无法创建与其他Schema同名的Snowflake表
解决方案:Snowflake不同Schema下创建同名表报错问题
核心原因
使用dbWriteTable时指定append = TRUE参数,默认会假设目标表已经存在(create = FALSE是默认值)。切换到schema2后,TEMP表尚未创建,因此触发“表不存在”的报错;而重命名为TEMP1时,因为是全新表名,dbWriteTable会自动创建表(此时create = TRUE生效),所以执行成功。
具体解决方法
方法1:显式指定create = TRUE
在调用dbWriteTable时同时设置append = TRUE和create = TRUE,实现“无表则创建,有表则追加”的逻辑:
# 切换到schema2的连接后执行 DBI::dbWriteTable(conn = con1, 'TEMP', value = df, append = TRUE, create = TRUE)
使用Id对象指定schema的写法同样适用:
table_id <- Id(schema="schema2", table="TEMP") DBI::dbWriteTable(conn = con1, table_id, value = df, append = TRUE, create = TRUE)
方法2:先检查表是否存在,再执行对应操作
通过dbExistsTable判断目标表状态,分情况执行创建或追加操作:
# 切换到schema2的连接后执行 if (!DBI::dbExistsTable(con1, "TEMP")) { DBI::dbWriteTable(con1, "TEMP", df) } else { DBI::dbWriteTable(con1, "TEMP", df, append = TRUE) }
方法3:确认角色权限(可选)
虽然你能创建TEMP1说明权限基本正常,仍可额外确认当前角色对schema2的建表权限:
-- 在Snowflake控制台执行 GRANT CREATE TABLE ON SCHEMA db.schema2 TO ROLE your_role;
内容的提问来源于stack exchange,提问作者user16024709
相关产品推荐
相关产品推荐

