如何使用 ODBC 包从 R 更改 SQL table 的 vartypes?
How can I change vartypes of a SQL table from R using ODBC package?
这有效,但是我想将 sepal.width 更改为 decimal(28,0)。是否可以在写入 SQL 之前执行此操作,或者我是否可以修改 SQL table 以更改 R 的列类型?
library(odbc)
library(DBI)
con <- DBI::dbConnect(odbc::odbc(),
Driver = "SQL Server",
Server = "localhost\SQLEXPRESS",
Database = "testdb",
Port = 1433)
dbWriteTable(con, "test", iris)
我知道我可以使用 RODBC,但我被迫使用 R 版本 3.6,所以它不是一个选项。
阅读 ?dbWriteTable
时寻找 field.types
。
没有:
# con2 <- dbConnect(...)
library(DBI)
dbWriteTable(con2, "test", iris)
dbGetQuery(con2, "select column_name, data_type, numeric_precision, numeric_precision_radix, numeric_scale from information_schema.columns where table_name='test'")
# column_name data_type numeric_precision numeric_precision_radix numeric_scale
# 1 Sepal.Length float 53 2 NA
# 2 Sepal.Width float 53 2 NA
# 3 Petal.Length float 53 2 NA
# 4 Petal.Width float 53 2 NA
# 5 Species varchar NA NA NA
dbExecute(con2, "drop table test")
# [1] 0
有:
dbWriteTable(con2, "test", iris, field.types=c("Sepal.Width"="decimal(28,0)"))
dbGetQuery(con2, "select column_name, data_type, numeric_precision, numeric_precision_radix, numeric_scale from information_schema.columns where table_name='test'")
# column_name data_type numeric_precision numeric_precision_radix numeric_scale
# 1 Sepal.Length float 53 2 NA
# 2 Sepal.Width decimal 28 10 0
# 3 Petal.Length float 53 2 NA
# 4 Petal.Width float 53 2 NA
# 5 Species varchar NA NA NA
dbExecute(con2, "drop table test")
# [1] 0
使用 docker 和 microsoft/mssql-server-linux
图像进行测试:
$ docker images | grep -E 'REPO|mssql'
REPOSITORY TAG IMAGE ID CREATED SIZE
microsoft/mssql-server-linux latest 314918ddaedf 2 years ago 1.35GB
$ docker run -d -p "11433:1433" --name localss -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Mysecretpassword1" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE microsoft/mssql-server-linux
dbGetQuery(con2, "select @@version")[[1]]
# [1] "Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4 (X64) \n\tNov 30 2018 12:57:58 \n\tCopyright (C) 2017 Microsoft Corporation\n\tDeveloper Edition (64-bit) on Linux (Ubuntu 16.04.5 LTS)"
这有效,但是我想将 sepal.width 更改为 decimal(28,0)。是否可以在写入 SQL 之前执行此操作,或者我是否可以修改 SQL table 以更改 R 的列类型?
library(odbc)
library(DBI)
con <- DBI::dbConnect(odbc::odbc(),
Driver = "SQL Server",
Server = "localhost\SQLEXPRESS",
Database = "testdb",
Port = 1433)
dbWriteTable(con, "test", iris)
我知道我可以使用 RODBC,但我被迫使用 R 版本 3.6,所以它不是一个选项。
阅读 ?dbWriteTable
时寻找 field.types
。
没有:
# con2 <- dbConnect(...)
library(DBI)
dbWriteTable(con2, "test", iris)
dbGetQuery(con2, "select column_name, data_type, numeric_precision, numeric_precision_radix, numeric_scale from information_schema.columns where table_name='test'")
# column_name data_type numeric_precision numeric_precision_radix numeric_scale
# 1 Sepal.Length float 53 2 NA
# 2 Sepal.Width float 53 2 NA
# 3 Petal.Length float 53 2 NA
# 4 Petal.Width float 53 2 NA
# 5 Species varchar NA NA NA
dbExecute(con2, "drop table test")
# [1] 0
有:
dbWriteTable(con2, "test", iris, field.types=c("Sepal.Width"="decimal(28,0)"))
dbGetQuery(con2, "select column_name, data_type, numeric_precision, numeric_precision_radix, numeric_scale from information_schema.columns where table_name='test'")
# column_name data_type numeric_precision numeric_precision_radix numeric_scale
# 1 Sepal.Length float 53 2 NA
# 2 Sepal.Width decimal 28 10 0
# 3 Petal.Length float 53 2 NA
# 4 Petal.Width float 53 2 NA
# 5 Species varchar NA NA NA
dbExecute(con2, "drop table test")
# [1] 0
使用 docker 和 microsoft/mssql-server-linux
图像进行测试:
$ docker images | grep -E 'REPO|mssql'
REPOSITORY TAG IMAGE ID CREATED SIZE
microsoft/mssql-server-linux latest 314918ddaedf 2 years ago 1.35GB
$ docker run -d -p "11433:1433" --name localss -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Mysecretpassword1" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE microsoft/mssql-server-linux
dbGetQuery(con2, "select @@version")[[1]]
# [1] "Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4 (X64) \n\tNov 30 2018 12:57:58 \n\tCopyright (C) 2017 Microsoft Corporation\n\tDeveloper Edition (64-bit) on Linux (Ubuntu 16.04.5 LTS)"