R 中的 ODBC/DBI 不会写入具有 R 中非默认架构的 table
ODBC/DBI in R will not write to a table with a non-default schema in R
问题
当尝试使用非默认架构写入 table 时,DBI 包中的 dbWriteTable
写入 default.non-default.tablename
而不是写入 non-default.tablename
。我知道 non-default.tablename
存在,因为它出现在我的 SSMS 数据库中。
可重现Example/What我试过
在 SQL 服务器中使用非默认架构 'guest' 创建此 table。我将它放在一个名为 'SAM':
的数据库中
CREATE TABLE guest.MikeTestTable(
[a] [float] NULL,
[b] [float] NULL,
[c] [varchar](255) NULL)
#Create a df to insert into guest.MikeTestTable
df <- data.frame(a = c(10, 20, 30),
b = c(20, 40, 60),
c = c("oneT", "twoT", "threeT"))
#Create a connection:
con <- DBI::dbConnect(odbc::odbc(),
.connection_string = "Driver={SQL Server};
server=localhost;
database=SAM;
trustedConnection=true;")
#Try to write contents of df to the table using `dbWriteTable`
DBI::dbWriteTable(conn = con,
name = "guest.MikeTestTable",
value = df,
append = TRUE)
#Create a query to read the data from `"guest.MikeTestTable"`:
q <- "SELECT [a]
,[b]
,[c]
FROM guest.MikeTestTable"
##Read the table into R to show that nothing actually got written to the
##table but that it recognizes `guest.MikeTestTable` does exist:
DBI::dbGetQuery(con, q)
[1] a b c
<0 rows> (or 0-length row.names)
我认为这是一个奇怪的结果,所以我打开了我的 SSMS,你瞧,table dbo.guest.MikeTestTable
已经创建了。任何帮助将不胜感激。
答案请看here
上周发布的 CRAN(与链接到的问题 @user111417 相关)使用新的 DBI::Id()
函数解决了这个问题,其中模式和 table 名称是分开和明确的。这是一个例子。
library(magrittr)
table_id <- DBI::Id(
schema = "schema_1",
table = "car"
)
ds <- mtcars %>%
tibble::rownames_to_column("car")
# Create the Table
channel <- DBI::dbConnect(
drv = odbc::odbc(),
dsn = "cdw_cache"
)
result <- DBI::dbWriteTable(
conn = channel,
name = table_id,
value = ds,
overwrite = T,
append = F
)
DBI::dbGetQuery(channel, "SELECT COUNT(*) FROM schema_1.car")
# Produces `1 32`
DBI::dbExistsTable(channel, table_id)
# Produces: [1] TRUE
DBI::dbDisconnect(channel)
(感谢 Daniel Wood 在 https://github.com/r-dbi/odbc/issues/191 中提供的帮助。)
问题
当尝试使用非默认架构写入 table 时,DBI 包中的 dbWriteTable
写入 default.non-default.tablename
而不是写入 non-default.tablename
。我知道 non-default.tablename
存在,因为它出现在我的 SSMS 数据库中。
可重现Example/What我试过
在 SQL 服务器中使用非默认架构 'guest' 创建此 table。我将它放在一个名为 'SAM':
的数据库中CREATE TABLE guest.MikeTestTable(
[a] [float] NULL,
[b] [float] NULL,
[c] [varchar](255) NULL)
#Create a df to insert into guest.MikeTestTable
df <- data.frame(a = c(10, 20, 30),
b = c(20, 40, 60),
c = c("oneT", "twoT", "threeT"))
#Create a connection:
con <- DBI::dbConnect(odbc::odbc(),
.connection_string = "Driver={SQL Server};
server=localhost;
database=SAM;
trustedConnection=true;")
#Try to write contents of df to the table using `dbWriteTable`
DBI::dbWriteTable(conn = con,
name = "guest.MikeTestTable",
value = df,
append = TRUE)
#Create a query to read the data from `"guest.MikeTestTable"`:
q <- "SELECT [a]
,[b]
,[c]
FROM guest.MikeTestTable"
##Read the table into R to show that nothing actually got written to the
##table but that it recognizes `guest.MikeTestTable` does exist:
DBI::dbGetQuery(con, q)
[1] a b c
<0 rows> (or 0-length row.names)
我认为这是一个奇怪的结果,所以我打开了我的 SSMS,你瞧,table dbo.guest.MikeTestTable
已经创建了。任何帮助将不胜感激。
答案请看here
上周发布的 CRAN(与链接到的问题 @user111417 相关)使用新的 DBI::Id()
函数解决了这个问题,其中模式和 table 名称是分开和明确的。这是一个例子。
library(magrittr)
table_id <- DBI::Id(
schema = "schema_1",
table = "car"
)
ds <- mtcars %>%
tibble::rownames_to_column("car")
# Create the Table
channel <- DBI::dbConnect(
drv = odbc::odbc(),
dsn = "cdw_cache"
)
result <- DBI::dbWriteTable(
conn = channel,
name = table_id,
value = ds,
overwrite = T,
append = F
)
DBI::dbGetQuery(channel, "SELECT COUNT(*) FROM schema_1.car")
# Produces `1 32`
DBI::dbExistsTable(channel, table_id)
# Produces: [1] TRUE
DBI::dbDisconnect(channel)
(感谢 Daniel Wood 在 https://github.com/r-dbi/odbc/issues/191 中提供的帮助。)